Compare commits
15 Commits
wip-redesi
...
wip-produc
Author | SHA1 | Date | |
---|---|---|---|
e076346765 | |||
0b1f295480 | |||
a64d3902fd | |||
8dd1de1018 | |||
3fdbb92b93 | |||
cf98883633 | |||
7b32b97203 | |||
7f58be4568 | |||
099984f97c | |||
8bfb40ce54 | |||
d60a65c9f0 | |||
9cd2853e49 | |||
3d5554d9ce | |||
764ccfa78e | |||
0b8ebecfea |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -3,10 +3,11 @@
|
||||
.coverage
|
||||
*.pyc
|
||||
__pycache__
|
||||
*.js.map
|
||||
*.css.map
|
||||
|
||||
/cloud/templates/
|
||||
/cloud/static/assets/css/
|
||||
/cloud/static/assets/js/bootstrap.min.js
|
||||
/cloud/static/assets/
|
||||
node_modules/
|
||||
|
||||
/config_local.py
|
||||
|
@@ -41,6 +41,7 @@ class CloudExtension(PillarExtension):
|
||||
'EXTERNAL_SUBSCRIPTIONS_MANAGEMENT_SERVER': 'https://store.blender.org/api/',
|
||||
'EXTERNAL_SUBSCRIPTIONS_TIMEOUT_SECS': 10,
|
||||
'BLENDER_ID_WEBHOOK_USER_CHANGED_SECRET': 'oos9wah1Zoa0Yau6ahThohleiChephoi',
|
||||
'NODE_TAGS': ['animation', 'modelling', 'rigging'],
|
||||
}
|
||||
|
||||
def eve_settings(self):
|
||||
|
@@ -391,6 +391,11 @@ def privacy():
|
||||
return render_template('privacy.html')
|
||||
|
||||
|
||||
@blueprint.route('/production')
|
||||
def production():
|
||||
return render_template('production.html')
|
||||
|
||||
|
||||
@blueprint.route('/emails/welcome.send')
|
||||
@login_required
|
||||
def emails_welcome_send():
|
||||
|
3
cloud/tagged/__init__.py
Normal file
3
cloud/tagged/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
"""Routes for fetching tagged assets."""
|
||||
|
||||
|
16
cloud/tagged/routes.py
Normal file
16
cloud/tagged/routes.py
Normal file
@@ -0,0 +1,16 @@
|
||||
import logging
|
||||
import datetime
|
||||
import functools
|
||||
|
||||
from flask import Blueprint, jsonify
|
||||
|
||||
blueprint = Blueprint('cloud.tagged', __name__, url_prefix='/tagged')
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@blueprint.route('/')
|
||||
def index():
|
||||
"""Return all tagged assets as JSON, grouped by tag."""
|
||||
|
||||
|
@@ -7,8 +7,7 @@ import json
|
||||
import logging
|
||||
import typing
|
||||
|
||||
from flask_login import request
|
||||
from flask import Blueprint
|
||||
from flask import Blueprint, request
|
||||
import werkzeug.exceptions as wz_exceptions
|
||||
|
||||
from pillar import current_app
|
||||
|
@@ -2,7 +2,7 @@ import os
|
||||
|
||||
DEBUG = True
|
||||
|
||||
BLENDER_ID_ENDPOINT = 'http://id.local:8000'
|
||||
BLENDER_ID_ENDPOINT = 'http://id.local:8000/'
|
||||
|
||||
SERVER_NAME = 'cloud.local:5001'
|
||||
SCHEME = 'http'
|
||||
|
@@ -1,6 +1,10 @@
|
||||
FROM ubuntu:17.10
|
||||
MAINTAINER Francesco Siddi <francesco@blender.org>
|
||||
FROM ubuntu:18.04
|
||||
LABEL maintainer="Sybren A. Stüvel <sybren@blender.studio>"
|
||||
|
||||
RUN apt-get update && apt-get install -qyy \
|
||||
-o APT::Install-Recommends=false -o APT::Install-Suggests=false \
|
||||
openssl ca-certificates
|
||||
RUN set -ex; \
|
||||
apt-get update; \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install \
|
||||
-qyy -o APT::Install-Recommends=false -o APT::Install-Suggests=false \
|
||||
tzdata openssl ca-certificates locales; \
|
||||
locale-gen en_US.UTF-8 en_GB.UTF-8 nl_NL.UTF-8
|
||||
ENV LANG en_US.UTF-8
|
||||
|
@@ -1 +0,0 @@
|
||||
1325134dd525b4a2c3272a1a0214dd54 Python-3.6.4.tar.xz
|
1
docker/2_buildpy/Python-3.6.6.tar.xz.md5
Normal file
1
docker/2_buildpy/Python-3.6.6.tar.xz.md5
Normal file
@@ -0,0 +1 @@
|
||||
c3f30a0aff425dda77d19e02f420d6ba Python-3.6.6.tar.xz
|
@@ -34,6 +34,9 @@ make -j8 install
|
||||
# Make sure we can run Python
|
||||
ldconfig
|
||||
|
||||
# Upgrade pip
|
||||
/opt/python/bin/python3 -m pip install -U pip
|
||||
|
||||
# Build mod-wsgi-py3 for Python 3.6
|
||||
cd /dpkg/mod-wsgi-*
|
||||
./configure --with-python=/opt/python/bin/python3
|
||||
|
@@ -1,9 +1,9 @@
|
||||
FROM pillar_base
|
||||
LABEL maintainer Sybren A. Stüvel <sybren@blender.studio>
|
||||
LABEL maintainer="Sybren A. Stüvel <sybren@blender.studio>"
|
||||
|
||||
RUN sed -i 's/^# deb-src/deb-src/' /etc/apt/sources.list && \
|
||||
apt-get update && \
|
||||
apt-get install -qy \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -qy \
|
||||
build-essential \
|
||||
apache2-dev \
|
||||
checkinstall \
|
||||
@@ -11,13 +11,13 @@ RUN sed -i 's/^# deb-src/deb-src/' /etc/apt/sources.list && \
|
||||
|
||||
RUN apt-get build-dep -y python3.6
|
||||
|
||||
ADD Python-3.6.4.tar.xz.md5 /Python-3.6.4.tar.xz.md5
|
||||
ADD Python-3.6.6.tar.xz.md5 /Python-3.6.6.tar.xz.md5
|
||||
|
||||
# Install Python sources
|
||||
RUN curl -O https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz && \
|
||||
md5sum -c Python-3.6.4.tar.xz.md5 && \
|
||||
tar xf Python-3.6.4.tar.xz && \
|
||||
rm -v Python-3.6.4.tar.xz
|
||||
RUN curl -O https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz && \
|
||||
md5sum -c Python-3.6.6.tar.xz.md5 && \
|
||||
tar xf Python-3.6.6.tar.xz && \
|
||||
rm -v Python-3.6.6.tar.xz
|
||||
|
||||
# Install mod-wsgi sources
|
||||
RUN mkdir -p /dpkg && cd /dpkg && apt-get source libapache2-mod-wsgi-py3
|
||||
@@ -32,4 +32,4 @@ RUN echo /opt/python/lib > /etc/ld.so.conf.d/python.conf
|
||||
RUN ldconfig
|
||||
ENV PATH=/opt/python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
ENV PYTHONSOURCE=/Python-3.6.4
|
||||
ENV PYTHONSOURCE=/Python-3.6.6
|
||||
|
@@ -1,5 +1,5 @@
|
||||
FROM pillar_base
|
||||
LABEL maintainer Sybren A. Stüvel <sybren@blender.studio>
|
||||
LABEL maintainer="Sybren A. Stüvel <sybren@blender.studio>"
|
||||
|
||||
ADD python /opt/python
|
||||
|
||||
@@ -10,5 +10,4 @@ RUN echo Python is installed in /opt/python/ > README.python
|
||||
ENV PATH=/opt/python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
RUN cd /opt/python/bin && \
|
||||
ln -s python3 python && \
|
||||
ln -s pip3 pip
|
||||
ln -s python3 python
|
||||
|
@@ -1,7 +1,9 @@
|
||||
FROM armadillica/pillar_py:3.6
|
||||
LABEL maintainer Sybren A. Stüvel <sybren@blender.studio>
|
||||
LABEL maintainer="Sybren A. Stüvel <sybren@blender.studio>"
|
||||
|
||||
RUN apt-get update && apt-get install -qy \
|
||||
RUN set -ex; \
|
||||
apt-get update; \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -qy \
|
||||
git \
|
||||
build-essential \
|
||||
checkinstall \
|
||||
|
@@ -1,17 +1,19 @@
|
||||
FROM armadillica/pillar_py:3.6
|
||||
LABEL maintainer Sybren A. Stüvel <sybren@blender.studio>
|
||||
LABEL maintainer="Sybren A. Stüvel <sybren@blender.studio>"
|
||||
|
||||
RUN apt-get update && apt-get install -qyy \
|
||||
-o APT::Install-Recommends=false -o APT::Install-Suggests=false \
|
||||
git \
|
||||
apache2 \
|
||||
libapache2-mod-xsendfile \
|
||||
libjpeg8 \
|
||||
libtiff5 \
|
||||
ffmpeg \
|
||||
rsyslog logrotate \
|
||||
nano vim-tiny curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
RUN set -ex; \
|
||||
apt-get update; \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -qy \
|
||||
-o APT::Install-Recommends=false -o APT::Install-Suggests=false \
|
||||
git \
|
||||
apache2 \
|
||||
libapache2-mod-xsendfile \
|
||||
libjpeg8 \
|
||||
libtiff5 \
|
||||
ffmpeg \
|
||||
rsyslog logrotate \
|
||||
nano vim-tiny curl; \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN ln -s /usr/bin/vim.tiny /usr/bin/vim
|
||||
|
||||
|
@@ -28,7 +28,7 @@ CACHE_REDIS_URL = 'redis://redis:6379'
|
||||
|
||||
PILLAR_SERVER_ENDPOINT = 'https://cloud.blender.org/api/'
|
||||
|
||||
BLENDER_ID_ENDPOINT = 'https://www.blender.org/id'
|
||||
BLENDER_ID_ENDPOINT = 'https://www.blender.org/id/'
|
||||
|
||||
GCLOUD_APP_CREDENTIALS = '/data/config/google_app.json'
|
||||
GCLOUD_PROJECT = 'blender-cloud'
|
||||
@@ -83,21 +83,22 @@ LOGGING = {
|
||||
}
|
||||
}
|
||||
|
||||
# Latest version of the add-on.
|
||||
BLENDER_CLOUD_ADDON_VERSION = '1.9.0'
|
||||
|
||||
REDIRECTS = {
|
||||
# For old links, refer to the services page (hopefully it refreshes then)
|
||||
'downloads/blender_cloud-latest-bundle.zip': 'https://cloud.blender.org/services#blender-addon',
|
||||
|
||||
# Latest Blender Cloud add-on; remember to update BLENDER_CLOUD_ADDON_VERSION.
|
||||
# Latest Blender Cloud add-on.
|
||||
'downloads/blender_cloud-latest-addon.zip':
|
||||
'https://storage.googleapis.com/institute-storage/addons/blender_cloud-1.8.0.addon.zip',
|
||||
f'https://storage.googleapis.com/institute-storage/addons/'
|
||||
f'blender_cloud-{BLENDER_CLOUD_ADDON_VERSION}.addon.zip',
|
||||
|
||||
# Redirect old Grafista endpoint to /stats
|
||||
'/stats/': '/stats',
|
||||
}
|
||||
|
||||
# Latest version of the add-on; remember to update REDIRECTS.
|
||||
BLENDER_CLOUD_ADDON_VERSION = '1.8.0'
|
||||
|
||||
UTM_LINKS = {
|
||||
'cartoon_brew': {
|
||||
'image': 'https://imgur.com/13nQTi3.png',
|
||||
|
@@ -1,3 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -f /installed ]; then
|
||||
return
|
||||
|
@@ -16,7 +16,7 @@ var uglify = require('gulp-uglify-es').default;
|
||||
|
||||
var enabled = {
|
||||
uglify: argv.production,
|
||||
maps: argv.production,
|
||||
maps: !argv.production,
|
||||
failCheck: !argv.production,
|
||||
prettyPug: !argv.production,
|
||||
cachify: !argv.production,
|
||||
|
@@ -9,3 +9,4 @@
|
||||
-e ../attract
|
||||
-e ../flamenco
|
||||
-e ../pillar-svnman
|
||||
-e .
|
||||
|
109
src/scripts/tagged_assets.js
Normal file
109
src/scripts/tagged_assets.js
Normal file
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
* Support for fetching & rendering assets by tags.
|
||||
*/
|
||||
(function($) {
|
||||
/* How many nodes to load initially, and when clicked on the 'Load Next' link. */
|
||||
const LOAD_INITIAL_COUNT = 5;
|
||||
const LOAD_NEXT_COUNT = 3;
|
||||
|
||||
/* Renders a node as a <li> element, returns a jQuery object. */
|
||||
function renderAsset(node) {
|
||||
let li = $('<li>').addClass('tagged-asset');
|
||||
let link = $('<a>')
|
||||
.attr('href', '/nodes/' + node._id + '/redir')
|
||||
.appendTo(li);
|
||||
|
||||
function warnNoPicture() {
|
||||
li.addClass('warning');
|
||||
link.text('no picture for node ' + node._id);
|
||||
}
|
||||
|
||||
if (!node.picture) {
|
||||
warnNoPicture();
|
||||
return li;
|
||||
}
|
||||
|
||||
// TODO: show 'loading' thingy
|
||||
$.get('/api/files/' + node.picture)
|
||||
.fail(function(error) {
|
||||
let msg = xhrErrorResponseMessage(error);
|
||||
li.addClass('error').text(msg);
|
||||
})
|
||||
.done(function(resp) {
|
||||
// Render the picture if it has the proper size.
|
||||
var show_variation = null;
|
||||
if (typeof resp.variations != 'undefined') {
|
||||
for (variation of resp.variations) {
|
||||
if (variation.size != 'm') continue;
|
||||
show_variation = variation;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (show_variation == null) {
|
||||
warnNoPicture();
|
||||
return;
|
||||
}
|
||||
|
||||
let img = $('<img>')
|
||||
.attr('alt', node.name)
|
||||
.attr('src', variation.link)
|
||||
.attr('width', variation.width)
|
||||
.attr('height', variation.height);
|
||||
link.append(img);
|
||||
});
|
||||
|
||||
return li;
|
||||
}
|
||||
|
||||
function loadNext(ul_element) {
|
||||
let $ul = $(ul_element);
|
||||
let tagged_assets = ul_element.tagged_assets; // Stored here by loadTaggedAssets().
|
||||
let already_loaded = $ul.find('li.tagged-asset').length;
|
||||
|
||||
let load_next = $ul.find('li.load-next');
|
||||
|
||||
let nodes_to_load = tagged_assets.slice(already_loaded, already_loaded + LOAD_NEXT_COUNT);
|
||||
for (node of nodes_to_load) {
|
||||
let li = renderAsset(node);
|
||||
load_next.before(li);
|
||||
}
|
||||
|
||||
if (already_loaded + LOAD_NEXT_COUNT >= tagged_assets.length)
|
||||
load_next.remove();
|
||||
}
|
||||
|
||||
$.fn.loadTaggedAssets = function(api_base_url) {
|
||||
this.each(function(index, ul_element) {
|
||||
// TODO(Sybren): show a 'loading' animation.
|
||||
$.get('/api/nodes/tagged/' + ul_element.dataset.assetTag)
|
||||
.fail(function(error) {
|
||||
let msg = xhrErrorResponseMessage(error);
|
||||
$('<li>').addClass('error').text(msg).appendTo(ul_element);
|
||||
})
|
||||
.done(function(resp) {
|
||||
// 'resp' is a list of node documents.
|
||||
// Store the response on the DOM <ul>-element so that we can later render more.
|
||||
ul_element.tagged_assets = resp;
|
||||
|
||||
// Here render the first N.
|
||||
for (node of resp.slice(0, LOAD_INITIAL_COUNT)) {
|
||||
let li = renderAsset(node);
|
||||
li.appendTo(ul_element);
|
||||
}
|
||||
|
||||
// Don't bother with a 'load next' link if there is no more.
|
||||
if (resp.length <= LOAD_INITIAL_COUNT) return;
|
||||
|
||||
// Construct the 'load next' link.
|
||||
let load_next = $('<li>').addClass('load-next');
|
||||
let link = $('<a>')
|
||||
.attr('href', 'javascript:void(0);')
|
||||
.click(function() { loadNext(ul_element); return false; })
|
||||
.text('Load next')
|
||||
.appendTo(load_next);
|
||||
load_next.appendTo(ul_element);
|
||||
});
|
||||
});
|
||||
};
|
||||
}(jQuery));
|
@@ -193,16 +193,16 @@ style.
|
||||
small October 30th, 2015
|
||||
.page-card-summary
|
||||
| Introducing integrated blogs in Blender Cloud projects. Glass Half is the first project fully developed on the new Blender Cloud. It's also the first and only project to have share its
|
||||
a(href='https://cloud.blender.org/p/glass-half/5627bb22f0e7220061109c9f') animation dailies
|
||||
a(href='/p/glass-half/5627bb22f0e7220061109c9f') animation dailies
|
||||
| ! But the biggest outcome from Glass Half was definitely
|
||||
a(href='https://cloud.blender.org/p/glass-half/569d6044c379cf445461293e') Flexirig
|
||||
a(href='/p/glass-half/569d6044c379cf445461293e') Flexirig
|
||||
| .
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/p/glass-half/blog/glass-half-premiere')
|
||||
a(href='/p/glass-half/blog/glass-half-premiere')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_10_30_glass.jpg') }}", alt="Glass Half")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/new-art-gallery-with-gleb-alexandrov')
|
||||
a(href='/blog/new-art-gallery-with-gleb-alexandrov')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_11_19_art.jpg') }}", alt="Art Gallery")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
@@ -218,11 +218,11 @@ style.
|
||||
.page-card-summary
|
||||
| With so much going on in the Cloud at at the studio. The Blender Institute Podcast was born! Sharing our daily studio work, Blender community news, and interacting with the awesome Blender Cloud subscribers.
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-blender-institute-podcast')
|
||||
a(href='/blog/introducing-blender-institute-podcast')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_11_24_bip.jpg') }}", alt="Blender Institute Podcast")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/p/blenrig/blog/welcome-to-the-blenrig-project')
|
||||
a(href='/p/blenrig/blog/welcome-to-the-blenrig-project')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_12_01_blenrig.jpg') }}", alt="Blenrig")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
@@ -238,11 +238,11 @@ style.
|
||||
.page-card-summary
|
||||
| The biggest source for CC0/Public Domain textures on the interwebs goes live. First as beta, as a quick gift right before Xmas 2015!
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/new-texture-library')
|
||||
a(href='/blog/new-texture-library')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_12_23_textures.jpg') }}", alt="Texture Library")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/nraryew-the-character-lib')
|
||||
a(href='/blog/nraryew-the-character-lib')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_01_05_charlib.jpg') }}", alt="Character Library")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
@@ -262,11 +262,11 @@ style.
|
||||
a(href='https://www.youtube.com/watch?v=kQH897V9bDg&list=PLI2TkLMzCSr_H6ppmzDtU0ut0RwxGvXjv') nicely edited Weekly video reports
|
||||
| .
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/p/caminandes-3/blog/caminandes-llamigos')
|
||||
a(href='/p/caminandes-3/blog/caminandes-llamigos')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_01_30_llamigos.jpg') }}", alt="Caminandes: Llamigos")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/welcome-sybren')
|
||||
a(href='/blog/welcome-sybren')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_03_01_sybren.jpg') }}", alt="Dr. Sybren!")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
@@ -282,11 +282,11 @@ style.
|
||||
.page-card-summary
|
||||
| Create your own private projects on Blender Cloud.
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/welcome-sybren')
|
||||
a(href='/blog/welcome-sybren')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_03_projects.jpg') }}", alt="Projects")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-project-sharing')
|
||||
a(href='/blog/introducing-project-sharing')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_09_projectsharing.jpg') }}", alt="Sharing")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
@@ -302,11 +302,11 @@ style.
|
||||
.page-card-summary
|
||||
| Browse the textures from within Blender!
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-project-sharing')
|
||||
a(href='/blog/introducing-project-sharing')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_11_addon.jpg') }}", alt="Blender Cloud Add-on")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-private-texture-libraries')
|
||||
a(href='/blog/introducing-private-texture-libraries')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_23_privtextures.jpg') }}", alt="Texture Libraries")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
@@ -322,11 +322,11 @@ style.
|
||||
.page-card-summary
|
||||
| Sync your Blender preferences across multiple devices.
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-blender-sync')
|
||||
a(href='/blog/introducing-blender-sync')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_06_30_sync.jpg') }}", alt="Blender Sync")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-image-sharing')
|
||||
a(href='/blog/introducing-image-sharing')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_07_14_image.jpg') }}", alt="Image Sharing")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
@@ -337,21 +337,21 @@ style.
|
||||
section.page-card
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
a(href='https://cloud.blender.org/blog/introducing-the-hdri-library')
|
||||
a(href='/blog/introducing-the-hdri-library')
|
||||
| HDRI Library
|
||||
small July 27th, 2016
|
||||
.page-card-summary
|
||||
| High-dynamic range images are now available on Blender Cloud! With their own special viewer. Also available via the Blender Cloud add-on.
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-the-hdri-library')
|
||||
a(href='/blog/introducing-the-hdri-library')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_07_27_hdri.jpg') }}", alt="HDRI Library")
|
||||
section.page-card
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/blog/introducing-the-hdri-library')
|
||||
a(href='/blog/introducing-the-hdri-library')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_12_06_toon.jpg') }}", alt="Hdri Library")
|
||||
.page-card-side
|
||||
h2.page-card-title
|
||||
a(href='https://cloud.blender.org/blog/new-training-toon-character-workflow')
|
||||
a(href='/blog/new-training-toon-character-workflow')
|
||||
| Toon Character Workflow
|
||||
small December 6th, 2016
|
||||
.page-card-summary
|
||||
@@ -366,7 +366,7 @@ style.
|
||||
| to all resources and training produced so far!
|
||||
a.page-card-cta(href='https://store.blender.org/product/membership/') Subscribe
|
||||
.page-card-side
|
||||
a(href='https://cloud.blender.org/p/agent-327')
|
||||
a(href='/p/agent-327')
|
||||
img.img-responsive(src="{{ url_for('static_cloud', filename='img/2017_03_10_agent.jpg') }}", alt="Agent 327")
|
||||
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
| {% block og %}
|
||||
meta(property="og:type", content="website")
|
||||
meta(property="og:url", content="https://cloud.blender.org/")
|
||||
meta(property="og:url", content="{{ request.url }}")
|
||||
|
||||
meta(property="og:title", content="Blender Cloud")
|
||||
meta(name="twitter:title", content="Blender Cloud")
|
||||
|
@@ -19,7 +19,7 @@ html(lang="en")
|
||||
|
||||
| {% block og %}
|
||||
meta(property="og:title", content="Blender Cloud")
|
||||
meta(property="og:url", content="https://cloud.blender.org")
|
||||
meta(property="og:url", content="{{ request.url }}")
|
||||
meta(property="og:type", content="website")
|
||||
meta(property="og:image", content="{{ url_for('static', filename='assets/img/backgrounds/background_gleb_locomotive.jpg')}}")
|
||||
meta(property="og:description", content="Blender Cloud is a web based service developed by Blender Institute that allows people to access the training videos and all the data from the open projects.")
|
||||
@@ -436,9 +436,6 @@ html(lang="en")
|
||||
if (typeof $().tooltip != 'undefined'){
|
||||
$('[data-toggle="tooltip"]').tooltip({'delay' : {'show': 0, 'hide': 0}});
|
||||
}
|
||||
if(typeof($.fn.popover) != 'undefined'){
|
||||
$('[data-toggle="popover"]').popover();
|
||||
}
|
||||
|
||||
| {% block footer_scripts_pre %}{% endblock %}
|
||||
| {% block footer_scripts %}{% endblock %}
|
||||
|
35
src/templates/production.pug
Normal file
35
src/templates/production.pug
Normal file
@@ -0,0 +1,35 @@
|
||||
| {% extends 'layout.html' %}
|
||||
| {% block page_title %}Production of Stuff{% endblock %}
|
||||
| {% block head %}
|
||||
script(src="{{ url_for('static_cloud', filename='assets/js/tagged_assets.min.js') }}")
|
||||
|
||||
script.
|
||||
$(function() {
|
||||
$('ul.asset-list').loadTaggedAssets();
|
||||
})
|
||||
| {% endblock %}
|
||||
| {% block body %}
|
||||
#page-container
|
||||
#page-content
|
||||
h2 Production of Stuff
|
||||
p.
|
||||
Here are our hand-selected assets 'bout stuff.
|
||||
|
||||
h3 Animation
|
||||
ul.asset-list(data-asset-tag="animation")
|
||||
|
||||
h3 Modelling
|
||||
ul.asset-list(data-asset-tag="modelling")
|
||||
|
||||
h3 Rigging
|
||||
ul.asset-list(data-asset-tag="rigging")
|
||||
|
||||
h3 pipeline
|
||||
ul.asset-list(data-asset-tag="pipeline")
|
||||
|
||||
h3 lookdev
|
||||
ul.asset-list(data-asset-tag="lookdev")
|
||||
|
||||
h3 crazyspace
|
||||
ul.asset-list(data-asset-tag="crazyspace")
|
||||
| {% endblock body%}
|
@@ -51,7 +51,7 @@ meta(name="twitter:description", content="Blender Cloud, your source for open co
|
||||
|
||||
| {% endif %}
|
||||
|
||||
meta(property="og:url", content="{{url_for('projects.view_node', project_url=project.url, node_id=node._id)}}")
|
||||
meta(property="og:url", content="{{url_for('projects.view_node', project_url=project.url, node_id=node._id, _external=True)}}")
|
||||
| {% else %}
|
||||
meta(property="og:title", content="{{ project.name }} Blog on Blender Cloud")
|
||||
meta(name="twitter:title", content="{{ project.name }} Blog on Blender Cloud")
|
||||
|
@@ -24,7 +24,7 @@ include mixins/components
|
||||
|
||||
| {% block og %}
|
||||
meta(property="og:type", content="website")
|
||||
meta(property="og:url", content="https://cloud.blender.org")
|
||||
meta(property="og:url", content="{{ request.url }}")
|
||||
|
||||
meta(property="og:title", content="{{ page_title }} on Blender Cloud")
|
||||
meta(name="twitter:title", content="{{ page_title }} on Blender Cloud")
|
||||
|
@@ -5,7 +5,7 @@ include mixins/components
|
||||
|
||||
| {% block og %}
|
||||
meta(property="og:type", content="website")
|
||||
meta(property="og:url", content="{{ url_for('cloud.services') }}")
|
||||
meta(property="og:url", content="{{ request.url }}")
|
||||
|
||||
meta(property="og:title", content="Services - Blender Cloud")
|
||||
meta(name="twitter:title", content="Services - Blender Cloud")
|
||||
@@ -39,8 +39,8 @@ section#blender-cloud-add-on.page-card
|
||||
|
||||
small Blender Cloud add-on requires Blender 2.78 or newer
|
||||
|
||||
a.btn.btn-outline-success(
|
||||
href="https://cloud.blender.org/r/downloads/blender_cloud-latest-addon.zip")
|
||||
a.btn.btn-primary(
|
||||
href="/r/downloads/blender_cloud-latest-addon.zip")
|
||||
i.pi-download
|
||||
| Download add-on <small>v</small> {{ config.BLENDER_CLOUD_ADDON_VERSION }}
|
||||
|
||||
@@ -61,10 +61,15 @@ section#blender-sync.page-card.right
|
||||
|
||||
.tip !{addon_text}
|
||||
|
||||
a.btn.btn-outline-primary(
|
||||
href="/r/downloads/blender_cloud-latest-addon.zip")
|
||||
i.pi-download
|
||||
| Download add-on <small>v</small> {{ config.BLENDER_CLOUD_ADDON_VERSION }}
|
||||
|
||||
a.page-card-cta(
|
||||
href="https://cloud.blender.org/blog/introducing-blender-sync")
|
||||
a.btn.btn-link(
|
||||
href="/blog/introducing-blender-sync")
|
||||
| Learn More
|
||||
i.pi-angle-right
|
||||
|
||||
.page-card-side
|
||||
img(
|
||||
@@ -76,13 +81,13 @@ section#texture-browser.page-card.right
|
||||
h2.page-card-title Texture & HDRI Browser
|
||||
.page-card-summary
|
||||
p.
|
||||
Access the <a href="https://cloud.blender.org/p/textures/">Blender Cloud Textures</a>
|
||||
Access the <a href="/p/textures/">Blender Cloud Textures</a>
|
||||
library from within Blender using our exclusive add-on.
|
||||
Create, manage and share <em>your own</em> texture libraries!
|
||||
|
||||
.tip !{addon_text}
|
||||
|
||||
a.btn.btn-outline-success.js-watch-video(
|
||||
a.btn.btn-outline-primary.js-watch-video(
|
||||
href="https://www.youtube.com/watch?v=-srXYv2Osjw",
|
||||
data-youtube-id="-srXYv2Osjw")
|
||||
i.pi-play
|
||||
@@ -102,15 +107,16 @@ section#image-sharing.page-card.right
|
||||
|
||||
.tip !{addon_text}
|
||||
|
||||
a.btn.btn-outline-success.js-watch-video(
|
||||
a.btn.btn-outline-primary.js-watch-video(
|
||||
href="https://www.youtube.com/watch?v=yvtqeMBOAyk",
|
||||
data-youtube-id="yvtqeMBOAyk")
|
||||
i.pi-play
|
||||
| Watch Video
|
||||
|
||||
a.page-card-cta.outline(
|
||||
href="https://cloud.blender.org/blog/introducing-image-sharing")
|
||||
a.btn.btn-link(
|
||||
href="/blog/introducing-image-sharing")
|
||||
| Learn More
|
||||
i.pi-angle-right
|
||||
|
||||
.page-card-side
|
||||
img(
|
||||
@@ -124,9 +130,10 @@ section#projects.page-card.right
|
||||
Create and manage your own personal projects.
|
||||
Upload assets and collaborate with other Blender Cloud members.
|
||||
|
||||
a.page-card-cta(
|
||||
href="https://cloud.blender.org/blog/introducing-private-projects")
|
||||
a.btn.btn-link(
|
||||
href="/blog/introducing-private-projects")
|
||||
| Learn More
|
||||
i.pi-angle-right
|
||||
|
||||
.page-card-side
|
||||
img(
|
||||
@@ -140,16 +147,17 @@ section#attract.page-card.right
|
||||
.page-card-summary.
|
||||
Production-management software for your film, game, or commercial projects.
|
||||
|
||||
a.btn.btn-outline-success.js-watch-video(
|
||||
a.btn.btn-outline-primary.js-watch-video(
|
||||
href="https://www.youtube.com/watch?v=b9x1rlyyt_o",
|
||||
data-youtube-id="b9x1rlyyt_o")
|
||||
i.pi-play
|
||||
| Watch Video
|
||||
|
||||
a.page-card-cta(
|
||||
href="https://cloud.blender.org/blog/attract-and-flamenco-public-beta",
|
||||
a.btn.btn-link(
|
||||
href="/blog/attract-and-flamenco-public-beta",
|
||||
title="Learn more about Attract")
|
||||
| Learn More
|
||||
i.pi-angle-right
|
||||
|
||||
.page-card-side
|
||||
img(
|
||||
@@ -163,16 +171,17 @@ section#flamenco.page-card.right
|
||||
.page-card-summary.
|
||||
Take control of your computing infrastructure and get things done.
|
||||
|
||||
a.btn.btn-outline-success.js-watch-video(
|
||||
a.btn.btn-outline-primary.js-watch-video(
|
||||
href="https://www.youtube.com/watch?v=7cnFKhsM67Q",
|
||||
data-youtube-id="7cnFKhsM67Q")
|
||||
i.pi-play
|
||||
| Watch Video
|
||||
|
||||
a.page-card-cta(
|
||||
a.btn.btn-link(
|
||||
href="https://flamenco.io",
|
||||
title="Learn more about Flamenco")
|
||||
| Learn More
|
||||
i.pi-angle-right
|
||||
|
||||
.page-card-side
|
||||
img(
|
||||
@@ -190,7 +199,8 @@ section.page-card(
|
||||
.page-card-summary.text-white
|
||||
| Join us for only $9.90/month!
|
||||
|
||||
a.page-card-cta(href="https://store.blender.org/product/membership/")
|
||||
a.btn.btn-outline-light.px-3(href="https://store.blender.org/product/membership/")
|
||||
i.pi-heart.mr-2
|
||||
| Subscribe Now
|
||||
| {% endif %}
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
|
||||
| {% block og %}
|
||||
meta(property="og:title", content="Blender Cloud Statistics")
|
||||
meta(property="og:url", content="https://cloud.blender.org/stats")
|
||||
meta(property="og:url", content="{{ request.url }}")
|
||||
meta(property="og:image", content="{{ url_for('static', filename='assets/img/backgrounds/background_andy_hdribot_01.jpg')}}")
|
||||
| {% endblock %}
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
|
||||
| {% block og %}
|
||||
meta(property="og:title", content="Blender Cloud - Open Content Production Platform")
|
||||
meta(property="og:url", content="https://cloud.blender.org/")
|
||||
meta(property="og:url", content="{{ request.url }}")
|
||||
meta(property="og:image", content="{{ url_for('static', filename='assets/img/backgrounds/background_dweebs_01.jpg')}}")
|
||||
| {% endblock og %}
|
||||
|
||||
@@ -70,7 +70,7 @@ li.pt-1.pr-1
|
||||
improve it for everyone's benefit.
|
||||
|
||||
.page-card-side
|
||||
a.page-card-image(href="https://cloud.blender.org/p/caminandes-3/56bdacccc379cf00797160b0", target="_blank")
|
||||
a.page-card-image(href="/p/caminandes-3/56bdacccc379cf00797160b0", target="_blank")
|
||||
video(autoplay, loop)
|
||||
source(src="{{ url_for('static', filename='assets/img/features/animation_review_01.mp4')}}")
|
||||
|
||||
@@ -92,7 +92,7 @@ li.pt-1.pr-1
|
||||
Access high quality content, organized in
|
||||
#[a(href="{{ url_for('cloud.courses') }}") classes],
|
||||
#[a(href="{{ url_for('cloud.workshops') }}") workshop] and the
|
||||
#[a(href="https://cloud.blender.org/p/gallery") art gallery],
|
||||
#[a(href="/p/gallery") art gallery],
|
||||
a curated artwork selection, where you can open a
|
||||
.blend file and see how it was made.
|
||||
|
||||
@@ -108,7 +108,7 @@ li.pt-1.pr-1
|
||||
| See #[a.learn(href="{{ url_for('cloud.courses') }}") Courses] & #[a.learn(href="{{ url_for('cloud.courses') }}") Workshops]
|
||||
|
||||
.page-card-side
|
||||
a.page-card-image(href="https://cloud.blender.org/p/scripting-for-artists/")
|
||||
a.page-card-image(href="/p/scripting-for-artists/")
|
||||
img(
|
||||
alt="Sybren teaches Python Scripting with Blender",
|
||||
src="{{ url_for('static', filename='assets/img/backgrounds/background_sybren_01.jpg')}}")
|
||||
@@ -121,7 +121,7 @@ li.pt-1.pr-1
|
||||
.page-triplet-container.homepage
|
||||
.row
|
||||
.col-md-4
|
||||
.triplet-card(data-url="https://cloud.blender.org/p/minecraft-animation-workshop/")
|
||||
.triplet-card(data-url="/p/minecraft-animation-workshop/")
|
||||
.triplet-card-thumbnail
|
||||
img(
|
||||
alt="Textures",
|
||||
@@ -130,11 +130,11 @@ li.pt-1.pr-1
|
||||
h3 Minecraft Animation
|
||||
p.
|
||||
Learn how to make animations with this workshop by Dillon Gu.
|
||||
a.triplet-cta(href="https://cloud.blender.org/p/minecraft-animation-workshop/")
|
||||
a.triplet-cta(href="/p/minecraft-animation-workshop/")
|
||||
| LEARN MORE
|
||||
|
||||
.col-md-4
|
||||
.triplet-card(data-url="https://cloud.blender.org/p/motion-graphics/")
|
||||
.triplet-card(data-url="/p/motion-graphics/")
|
||||
.triplet-card-thumbnail
|
||||
img(
|
||||
alt="HDRI",
|
||||
@@ -143,11 +143,11 @@ li.pt-1.pr-1
|
||||
h3 Motion Graphics
|
||||
p.
|
||||
A comprehensive guide to motion graphics techniques using Blender.
|
||||
a.triplet-cta(href="https://cloud.blender.org/p/motion-graphics/")
|
||||
a.triplet-cta(href="/p/motion-graphics/")
|
||||
| LEARN MORE
|
||||
|
||||
.col-md-4
|
||||
.triplet-card(data-url="https://cloud.blender.org/p/gallery")
|
||||
.triplet-card(data-url="/p/gallery")
|
||||
.triplet-card-thumbnail
|
||||
img(
|
||||
alt="Characters",
|
||||
@@ -156,25 +156,25 @@ li.pt-1.pr-1
|
||||
h3 Art Walk-throughs
|
||||
p.
|
||||
Follow the creative process and techniques behind stunning artwork.
|
||||
a.triplet-cta(href="https://cloud.blender.org/p/gallery")
|
||||
a.triplet-cta(href="/p/gallery")
|
||||
| LEARN MORE
|
||||
|
||||
.row.training-other
|
||||
.col-md-10.col-md-offset-1
|
||||
p.
|
||||
Other training:
|
||||
#[a(href="https://cloud.blender.org/p/toon-character-workflow/") Toon Character Workflow],
|
||||
#[a(href="https://cloud.blender.org/p/3d-printing/") Blender for 3D Printing],
|
||||
#[a(href="https://cloud.blender.org/p/game-asset-creation/") Game Asset Creation],
|
||||
#[a(href="https://cloud.blender.org/p/blenderella/") Character Modeling],
|
||||
#[a(href="https://cloud.blender.org/p/character-animation/") Character Animation],
|
||||
#[a(href="https://cloud.blender.org/p/humane-rigging/") Introduction] and
|
||||
#[a(href="https://cloud.blender.org/p/blenrig/") Advanced Rigging],
|
||||
#[a(href="https://cloud.blender.org/p/track-match-2/") VFX Workflow],
|
||||
#[a(href="https://cloud.blender.org/p/creature-factory-2/") Creature] and
|
||||
#[a(href="https://cloud.blender.org/p/venoms-lab-2/") Cartoon Character creation],
|
||||
#[a(href="https://cloud.blender.org/p/chaos-evolution/") Advanced]
|
||||
#[a(href="https://cloud.blender.org/p/blend-and-paint/") Digital Painting] and
|
||||
#[a(href="/p/toon-character-workflow/") Toon Character Workflow],
|
||||
#[a(href="/p/3d-printing/") Blender for 3D Printing],
|
||||
#[a(href="/p/game-asset-creation/") Game Asset Creation],
|
||||
#[a(href="/p/blenderella/") Character Modeling],
|
||||
#[a(href="/p/character-animation/") Character Animation],
|
||||
#[a(href="/p/humane-rigging/") Introduction] and
|
||||
#[a(href="/p/blenrig/") Advanced Rigging],
|
||||
#[a(href="/p/track-match-2/") VFX Workflow],
|
||||
#[a(href="/p/creature-factory-2/") Creature] and
|
||||
#[a(href="/p/venoms-lab-2/") Cartoon Character creation],
|
||||
#[a(href="/p/chaos-evolution/") Advanced]
|
||||
#[a(href="/p/blend-and-paint/") Digital Painting] and
|
||||
#[a(href="{{ url_for('cloud.courses') }}") much more]!
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@ li.pt-1.pr-1
|
||||
.page-triplet-container.homepage
|
||||
.row
|
||||
.col-md-4
|
||||
.triplet-card(data-url="https://cloud.blender.org/p/hero/")
|
||||
.triplet-card(data-url="/p/hero/")
|
||||
.triplet-card-thumbnail
|
||||
img(
|
||||
alt="Hero",
|
||||
@@ -224,11 +224,11 @@ li.pt-1.pr-1
|
||||
h3 Hero
|
||||
p.
|
||||
The first ever Grease Pencil open movie made with Blender 2.8
|
||||
a.triplet-cta(href="https://cloud.blender.org/p/hero/")
|
||||
a.triplet-cta(href="/p/hero/")
|
||||
| LEARN MORE
|
||||
|
||||
.col-md-4
|
||||
.triplet-card(data-url="https://cloud.blender.org/p/spring/")
|
||||
.triplet-card(data-url="/p/spring/")
|
||||
.triplet-card-thumbnail
|
||||
img(
|
||||
alt="Spring",
|
||||
@@ -237,11 +237,11 @@ li.pt-1.pr-1
|
||||
h3 Spring
|
||||
p.
|
||||
A poetic fantasy film. #[br] A stunning visual journey.
|
||||
a.triplet-cta(href="https://cloud.blender.org/p/spring/")
|
||||
a.triplet-cta(href="/p/spring/")
|
||||
| LEARN MORE
|
||||
|
||||
.col-md-4
|
||||
.triplet-card(data-url="https://cloud.blender.org/p/caminandes-3/")
|
||||
.triplet-card(data-url="/p/caminandes-3/")
|
||||
.triplet-card-thumbnail
|
||||
img(
|
||||
alt="Caminandes",
|
||||
@@ -250,21 +250,21 @@ li.pt-1.pr-1
|
||||
h3 Caminandes
|
||||
p.
|
||||
Follow the adventures of Koro through the Patagonian pampas.
|
||||
a.triplet-cta(href="https://cloud.blender.org/p/caminandes-3/")
|
||||
a.triplet-cta(href="/p/caminandes-3/")
|
||||
| LEARN MORE
|
||||
|
||||
.row.training-other
|
||||
.col-md-10.col-md-offset-1
|
||||
p.
|
||||
Other open movies:
|
||||
#[a(href="https://cloud.blender.org/p/elephants-dream/") Elephants Dream],
|
||||
#[a(href="https://cloud.blender.org/p/big-buck-bunny/") Big Buck Bunny],
|
||||
#[a(href="https://cloud.blender.org/p/sintel/") Sintel],
|
||||
#[a(href="https://cloud.blender.org/p/tears-of-steel/") Tears of Steel],
|
||||
#[a(href="https://cloud.blender.org/p/cosmos-laundromat/") Cosmos Laundromat],
|
||||
#[a(href="https://cloud.blender.org/p/glass-half/") Glass Half],
|
||||
#[a(href="https://cloud.blender.org/p/dailydweebs/") The Daily Dweebs],
|
||||
#[a(href="https://cloud.blender.org/p/agent-327/") Agent 327]
|
||||
#[a(href="/p/elephants-dream/") Elephants Dream],
|
||||
#[a(href="/p/big-buck-bunny/") Big Buck Bunny],
|
||||
#[a(href="/p/sintel/") Sintel],
|
||||
#[a(href="/p/tears-of-steel/") Tears of Steel],
|
||||
#[a(href="/p/cosmos-laundromat/") Cosmos Laundromat],
|
||||
#[a(href="/p/glass-half/") Glass Half],
|
||||
#[a(href="/p/dailydweebs/") The Daily Dweebs],
|
||||
#[a(href="/p/agent-327/") Agent 327]
|
||||
and #[a(href="{{ url_for('cloud.open_projects') }}") more]
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user