15 Commits

Author SHA1 Message Date
e076346765 Start of "production videos", a.k.a. tagged assets overview
Tagged assets are shown in a list per tag. The list is dynamically
loaded with JavaScript.
2018-09-06 15:46:31 +02:00
0b1f295480 Services: Fix layout 2018-09-06 14:33:44 +02:00
a64d3902fd Bootstrap popovers are no longer used. 2018-09-06 14:24:31 +02:00
8dd1de1018 Merge branch 'wip-redesign'
# Conflicts:
#	src/templates/homepage.pug
#	src/templates/services.pug
2018-09-06 14:13:22 +02:00
3fdbb92b93 Fixed typo 2018-09-05 15:11:46 +02:00
cf98883633 Make <meta property="og:url"> tags have an absolute URL
Most of those can simply use `{{ request.url }}`, as this already contains
the absolute URL of the currently displayed page.
2018-09-05 13:58:13 +02:00
7b32b97203 Remove https://cloud.blender.org from URLs
URLs should be host-relative, so that they also work on devservers.
URLs in emails should remain absolute, though; we may want to change those
to use {{ url_for(..., _external=True) }} at some point.
2018-09-05 13:57:15 +02:00
7f58be4568 Updated Blender Cloud add-on to 1.9.0
Also change the config_local.py so that we only have to change one variable
for a new version.
2018-09-05 13:40:24 +02:00
099984f97c Added #!/bin/sh at top of shell script 2018-08-30 12:53:34 +02:00
8bfb40ce54 Various Docker image upgrades, read the entire commit message!
- Ubuntu 17.10 → 18.04.
- Python 3.6.3 → 3.6.6.
- Use `DEBIAN_FRONTEND=noninteractive` to prevent prompts during
  installation.
- Install `tzdata` in the base image as it's required by subimages.
- Correctly set maintainer in Dockerfile.
2018-08-30 12:53:34 +02:00
d60a65c9f0 End BLENDER_ID_ENDPOINT with a slash 2018-08-30 12:46:58 +02:00
9cd2853e49 Upgrade pip after building Python 2018-08-30 12:31:31 +02:00
3d5554d9ce BLENDER_ID_ENDPOINT should end with a slash
There is always a path component in a URL.
2018-08-29 14:20:23 +02:00
764ccfa78e Add -e . to requirements-dev.txt 2018-08-29 12:24:45 +02:00
0b8ebecfea Don't import flask_login.request
`flask_login.request` is the exact same thing as `flask.request`, so
importing it from `flask_login` makes no sense. Also, it's been removed
from the new Flask-Login.
2018-08-29 12:19:40 +02:00
29 changed files with 315 additions and 126 deletions

5
.gitignore vendored
View File

@@ -3,10 +3,11 @@
.coverage .coverage
*.pyc *.pyc
__pycache__ __pycache__
*.js.map
*.css.map
/cloud/templates/ /cloud/templates/
/cloud/static/assets/css/ /cloud/static/assets/
/cloud/static/assets/js/bootstrap.min.js
node_modules/ node_modules/
/config_local.py /config_local.py

View File

@@ -41,6 +41,7 @@ class CloudExtension(PillarExtension):
'EXTERNAL_SUBSCRIPTIONS_MANAGEMENT_SERVER': 'https://store.blender.org/api/', 'EXTERNAL_SUBSCRIPTIONS_MANAGEMENT_SERVER': 'https://store.blender.org/api/',
'EXTERNAL_SUBSCRIPTIONS_TIMEOUT_SECS': 10, 'EXTERNAL_SUBSCRIPTIONS_TIMEOUT_SECS': 10,
'BLENDER_ID_WEBHOOK_USER_CHANGED_SECRET': 'oos9wah1Zoa0Yau6ahThohleiChephoi', 'BLENDER_ID_WEBHOOK_USER_CHANGED_SECRET': 'oos9wah1Zoa0Yau6ahThohleiChephoi',
'NODE_TAGS': ['animation', 'modelling', 'rigging'],
} }
def eve_settings(self): def eve_settings(self):

View File

@@ -391,6 +391,11 @@ def privacy():
return render_template('privacy.html') return render_template('privacy.html')
@blueprint.route('/production')
def production():
return render_template('production.html')
@blueprint.route('/emails/welcome.send') @blueprint.route('/emails/welcome.send')
@login_required @login_required
def emails_welcome_send(): def emails_welcome_send():

3
cloud/tagged/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
"""Routes for fetching tagged assets."""

16
cloud/tagged/routes.py Normal file
View 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."""

View File

@@ -7,8 +7,7 @@ import json
import logging import logging
import typing import typing
from flask_login import request from flask import Blueprint, request
from flask import Blueprint
import werkzeug.exceptions as wz_exceptions import werkzeug.exceptions as wz_exceptions
from pillar import current_app from pillar import current_app

View File

@@ -2,7 +2,7 @@ import os
DEBUG = True DEBUG = True
BLENDER_ID_ENDPOINT = 'http://id.local:8000' BLENDER_ID_ENDPOINT = 'http://id.local:8000/'
SERVER_NAME = 'cloud.local:5001' SERVER_NAME = 'cloud.local:5001'
SCHEME = 'http' SCHEME = 'http'

View File

@@ -1,6 +1,10 @@
FROM ubuntu:17.10 FROM ubuntu:18.04
MAINTAINER Francesco Siddi <francesco@blender.org> LABEL maintainer="Sybren A. Stüvel <sybren@blender.studio>"
RUN apt-get update && apt-get install -qyy \ RUN set -ex; \
-o APT::Install-Recommends=false -o APT::Install-Suggests=false \ apt-get update; \
openssl ca-certificates 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

View File

@@ -1 +0,0 @@
1325134dd525b4a2c3272a1a0214dd54 Python-3.6.4.tar.xz

View File

@@ -0,0 +1 @@
c3f30a0aff425dda77d19e02f420d6ba Python-3.6.6.tar.xz

View File

@@ -34,6 +34,9 @@ make -j8 install
# Make sure we can run Python # Make sure we can run Python
ldconfig ldconfig
# Upgrade pip
/opt/python/bin/python3 -m pip install -U pip
# Build mod-wsgi-py3 for Python 3.6 # Build mod-wsgi-py3 for Python 3.6
cd /dpkg/mod-wsgi-* cd /dpkg/mod-wsgi-*
./configure --with-python=/opt/python/bin/python3 ./configure --with-python=/opt/python/bin/python3

View File

@@ -1,9 +1,9 @@
FROM pillar_base 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 && \ RUN sed -i 's/^# deb-src/deb-src/' /etc/apt/sources.list && \
apt-get update && \ apt-get update && \
apt-get install -qy \ DEBIAN_FRONTEND=noninteractive apt-get install -qy \
build-essential \ build-essential \
apache2-dev \ apache2-dev \
checkinstall \ 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 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 # Install Python sources
RUN curl -O https://www.python.org/ftp/python/3.6.4/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.4.tar.xz.md5 && \ md5sum -c Python-3.6.6.tar.xz.md5 && \
tar xf Python-3.6.4.tar.xz && \ tar xf Python-3.6.6.tar.xz && \
rm -v Python-3.6.4.tar.xz rm -v Python-3.6.6.tar.xz
# Install mod-wsgi sources # Install mod-wsgi sources
RUN mkdir -p /dpkg && cd /dpkg && apt-get source libapache2-mod-wsgi-py3 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 RUN ldconfig
ENV PATH=/opt/python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 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

View File

@@ -1,5 +1,5 @@
FROM pillar_base 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 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 ENV PATH=/opt/python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RUN cd /opt/python/bin && \ RUN cd /opt/python/bin && \
ln -s python3 python && \ ln -s python3 python
ln -s pip3 pip

View File

@@ -1,7 +1,9 @@
FROM armadillica/pillar_py:3.6 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 \ git \
build-essential \ build-essential \
checkinstall \ checkinstall \

View File

@@ -1,17 +1,19 @@
FROM armadillica/pillar_py:3.6 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 \ RUN set -ex; \
-o APT::Install-Recommends=false -o APT::Install-Suggests=false \ apt-get update; \
git \ DEBIAN_FRONTEND=noninteractive apt-get install -qy \
apache2 \ -o APT::Install-Recommends=false -o APT::Install-Suggests=false \
libapache2-mod-xsendfile \ git \
libjpeg8 \ apache2 \
libtiff5 \ libapache2-mod-xsendfile \
ffmpeg \ libjpeg8 \
rsyslog logrotate \ libtiff5 \
nano vim-tiny curl \ ffmpeg \
&& rm -rf /var/lib/apt/lists/* rsyslog logrotate \
nano vim-tiny curl; \
rm -rf /var/lib/apt/lists/*
RUN ln -s /usr/bin/vim.tiny /usr/bin/vim RUN ln -s /usr/bin/vim.tiny /usr/bin/vim

View File

@@ -28,7 +28,7 @@ CACHE_REDIS_URL = 'redis://redis:6379'
PILLAR_SERVER_ENDPOINT = 'https://cloud.blender.org/api/' 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_APP_CREDENTIALS = '/data/config/google_app.json'
GCLOUD_PROJECT = 'blender-cloud' GCLOUD_PROJECT = 'blender-cloud'
@@ -83,21 +83,22 @@ LOGGING = {
} }
} }
# Latest version of the add-on.
BLENDER_CLOUD_ADDON_VERSION = '1.9.0'
REDIRECTS = { REDIRECTS = {
# For old links, refer to the services page (hopefully it refreshes then) # 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', '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': '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 # Redirect old Grafista endpoint to /stats
'/stats/': '/stats', '/stats/': '/stats',
} }
# Latest version of the add-on; remember to update REDIRECTS.
BLENDER_CLOUD_ADDON_VERSION = '1.8.0'
UTM_LINKS = { UTM_LINKS = {
'cartoon_brew': { 'cartoon_brew': {
'image': 'https://imgur.com/13nQTi3.png', 'image': 'https://imgur.com/13nQTi3.png',

View File

@@ -1,3 +1,4 @@
#!/bin/sh
if [ -f /installed ]; then if [ -f /installed ]; then
return return

View File

@@ -16,7 +16,7 @@ var uglify = require('gulp-uglify-es').default;
var enabled = { var enabled = {
uglify: argv.production, uglify: argv.production,
maps: argv.production, maps: !argv.production,
failCheck: !argv.production, failCheck: !argv.production,
prettyPug: !argv.production, prettyPug: !argv.production,
cachify: !argv.production, cachify: !argv.production,

View File

@@ -9,3 +9,4 @@
-e ../attract -e ../attract
-e ../flamenco -e ../flamenco
-e ../pillar-svnman -e ../pillar-svnman
-e .

View 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));

View File

@@ -193,16 +193,16 @@ style.
small October 30th, 2015 small October 30th, 2015
.page-card-summary .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 | 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 | ! 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 .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_10_30_glass.jpg') }}", alt="Glass Half")
section.page-card section.page-card
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_11_19_art.jpg') }}", alt="Art Gallery")
.page-card-side .page-card-side
h2.page-card-title h2.page-card-title
@@ -218,11 +218,11 @@ style.
.page-card-summary .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. | 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 .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_11_24_bip.jpg') }}", alt="Blender Institute Podcast")
section.page-card section.page-card
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_12_01_blenrig.jpg') }}", alt="Blenrig")
.page-card-side .page-card-side
h2.page-card-title h2.page-card-title
@@ -238,11 +238,11 @@ style.
.page-card-summary .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! | 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 .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2015_12_23_textures.jpg') }}", alt="Texture Library")
section.page-card section.page-card
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_01_05_charlib.jpg') }}", alt="Character Library")
.page-card-side .page-card-side
h2.page-card-title 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 a(href='https://www.youtube.com/watch?v=kQH897V9bDg&list=PLI2TkLMzCSr_H6ppmzDtU0ut0RwxGvXjv') nicely edited Weekly video reports
| . | .
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_01_30_llamigos.jpg') }}", alt="Caminandes: Llamigos")
section.page-card section.page-card
.page-card-side .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!") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_03_01_sybren.jpg') }}", alt="Dr. Sybren!")
.page-card-side .page-card-side
h2.page-card-title h2.page-card-title
@@ -282,11 +282,11 @@ style.
.page-card-summary .page-card-summary
| Create your own private projects on Blender Cloud. | Create your own private projects on Blender Cloud.
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_03_projects.jpg') }}", alt="Projects")
section.page-card section.page-card
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_09_projectsharing.jpg') }}", alt="Sharing")
.page-card-side .page-card-side
h2.page-card-title h2.page-card-title
@@ -302,11 +302,11 @@ style.
.page-card-summary .page-card-summary
| Browse the textures from within Blender! | Browse the textures from within Blender!
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_11_addon.jpg') }}", alt="Blender Cloud Add-on")
section.page-card section.page-card
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_05_23_privtextures.jpg') }}", alt="Texture Libraries")
.page-card-side .page-card-side
h2.page-card-title h2.page-card-title
@@ -322,11 +322,11 @@ style.
.page-card-summary .page-card-summary
| Sync your Blender preferences across multiple devices. | Sync your Blender preferences across multiple devices.
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_06_30_sync.jpg') }}", alt="Blender Sync")
section.page-card section.page-card
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_07_14_image.jpg') }}", alt="Image Sharing")
.page-card-side .page-card-side
h2.page-card-title h2.page-card-title
@@ -337,21 +337,21 @@ style.
section.page-card section.page-card
.page-card-side .page-card-side
h2.page-card-title h2.page-card-title
a(href='https://cloud.blender.org/blog/introducing-the-hdri-library') a(href='/blog/introducing-the-hdri-library')
| HDRI Library | HDRI Library
small July 27th, 2016 small July 27th, 2016
.page-card-summary .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. | 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 .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_07_27_hdri.jpg') }}", alt="HDRI Library")
section.page-card section.page-card
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2016_12_06_toon.jpg') }}", alt="Hdri Library")
.page-card-side .page-card-side
h2.page-card-title 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 | Toon Character Workflow
small December 6th, 2016 small December 6th, 2016
.page-card-summary .page-card-summary
@@ -366,7 +366,7 @@ style.
| to all resources and training produced so far! | to all resources and training produced so far!
a.page-card-cta(href='https://store.blender.org/product/membership/') Subscribe a.page-card-cta(href='https://store.blender.org/product/membership/') Subscribe
.page-card-side .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") img.img-responsive(src="{{ url_for('static_cloud', filename='img/2017_03_10_agent.jpg') }}", alt="Agent 327")

View File

@@ -6,7 +6,7 @@
| {% block og %} | {% block og %}
meta(property="og:type", content="website") 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(property="og:title", content="Blender Cloud")
meta(name="twitter:title", content="Blender Cloud") meta(name="twitter:title", content="Blender Cloud")

View File

@@ -19,7 +19,7 @@ html(lang="en")
| {% block og %} | {% block og %}
meta(property="og:title", content="Blender Cloud") 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:type", content="website")
meta(property="og:image", content="{{ url_for('static', filename='assets/img/backgrounds/background_gleb_locomotive.jpg')}}") 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.") 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'){ if (typeof $().tooltip != 'undefined'){
$('[data-toggle="tooltip"]').tooltip({'delay' : {'show': 0, 'hide': 0}}); $('[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_pre %}{% endblock %}
| {% block footer_scripts %}{% endblock %} | {% block footer_scripts %}{% endblock %}

View 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%}

View File

@@ -51,7 +51,7 @@ meta(name="twitter:description", content="Blender Cloud, your source for open co
| {% endif %} | {% 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 %} | {% else %}
meta(property="og:title", content="{{ project.name }} Blog on Blender Cloud") meta(property="og:title", content="{{ project.name }} Blog on Blender Cloud")
meta(name="twitter:title", content="{{ project.name }} Blog on Blender Cloud") meta(name="twitter:title", content="{{ project.name }} Blog on Blender Cloud")

View File

@@ -24,7 +24,7 @@ include mixins/components
| {% block og %} | {% block og %}
meta(property="og:type", content="website") 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(property="og:title", content="{{ page_title }} on Blender Cloud")
meta(name="twitter:title", content="{{ page_title }} on Blender Cloud") meta(name="twitter:title", content="{{ page_title }} on Blender Cloud")

View File

@@ -5,7 +5,7 @@ include mixins/components
| {% block og %} | {% block og %}
meta(property="og:type", content="website") 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(property="og:title", content="Services - Blender Cloud")
meta(name="twitter: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 small Blender Cloud add-on requires Blender 2.78 or newer
a.btn.btn-outline-success( a.btn.btn-primary(
href="https://cloud.blender.org/r/downloads/blender_cloud-latest-addon.zip") href="/r/downloads/blender_cloud-latest-addon.zip")
i.pi-download i.pi-download
| Download add-on &nbsp;<small>v</small> {{ config.BLENDER_CLOUD_ADDON_VERSION }} | Download add-on &nbsp;<small>v</small> {{ config.BLENDER_CLOUD_ADDON_VERSION }}
@@ -61,10 +61,15 @@ section#blender-sync.page-card.right
.tip !{addon_text} .tip !{addon_text}
a.btn.btn-outline-primary(
href="/r/downloads/blender_cloud-latest-addon.zip")
i.pi-download
| Download add-on &nbsp;<small>v</small> {{ config.BLENDER_CLOUD_ADDON_VERSION }}
a.page-card-cta( a.btn.btn-link(
href="https://cloud.blender.org/blog/introducing-blender-sync") href="/blog/introducing-blender-sync")
| Learn More | Learn More
i.pi-angle-right
.page-card-side .page-card-side
img( img(
@@ -76,13 +81,13 @@ section#texture-browser.page-card.right
h2.page-card-title Texture & HDRI Browser h2.page-card-title Texture & HDRI Browser
.page-card-summary .page-card-summary
p. 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. library from within Blender using our exclusive add-on.
Create, manage and share <em>your own</em> texture libraries! Create, manage and share <em>your own</em> texture libraries!
.tip !{addon_text} .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", href="https://www.youtube.com/watch?v=-srXYv2Osjw",
data-youtube-id="-srXYv2Osjw") data-youtube-id="-srXYv2Osjw")
i.pi-play i.pi-play
@@ -102,15 +107,16 @@ section#image-sharing.page-card.right
.tip !{addon_text} .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", href="https://www.youtube.com/watch?v=yvtqeMBOAyk",
data-youtube-id="yvtqeMBOAyk") data-youtube-id="yvtqeMBOAyk")
i.pi-play i.pi-play
| Watch Video | Watch Video
a.page-card-cta.outline( a.btn.btn-link(
href="https://cloud.blender.org/blog/introducing-image-sharing") href="/blog/introducing-image-sharing")
| Learn More | Learn More
i.pi-angle-right
.page-card-side .page-card-side
img( img(
@@ -124,9 +130,10 @@ section#projects.page-card.right
Create and manage your own personal projects. Create and manage your own personal projects.
Upload assets and collaborate with other Blender Cloud members. Upload assets and collaborate with other Blender Cloud members.
a.page-card-cta( a.btn.btn-link(
href="https://cloud.blender.org/blog/introducing-private-projects") href="/blog/introducing-private-projects")
| Learn More | Learn More
i.pi-angle-right
.page-card-side .page-card-side
img( img(
@@ -140,16 +147,17 @@ section#attract.page-card.right
.page-card-summary. .page-card-summary.
Production-management software for your film, game, or commercial projects. 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", href="https://www.youtube.com/watch?v=b9x1rlyyt_o",
data-youtube-id="b9x1rlyyt_o") data-youtube-id="b9x1rlyyt_o")
i.pi-play i.pi-play
| Watch Video | Watch Video
a.page-card-cta( a.btn.btn-link(
href="https://cloud.blender.org/blog/attract-and-flamenco-public-beta", href="/blog/attract-and-flamenco-public-beta",
title="Learn more about Attract") title="Learn more about Attract")
| Learn More | Learn More
i.pi-angle-right
.page-card-side .page-card-side
img( img(
@@ -163,16 +171,17 @@ section#flamenco.page-card.right
.page-card-summary. .page-card-summary.
Take control of your computing infrastructure and get things done. 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", href="https://www.youtube.com/watch?v=7cnFKhsM67Q",
data-youtube-id="7cnFKhsM67Q") data-youtube-id="7cnFKhsM67Q")
i.pi-play i.pi-play
| Watch Video | Watch Video
a.page-card-cta( a.btn.btn-link(
href="https://flamenco.io", href="https://flamenco.io",
title="Learn more about Flamenco") title="Learn more about Flamenco")
| Learn More | Learn More
i.pi-angle-right
.page-card-side .page-card-side
img( img(
@@ -190,7 +199,8 @@ section.page-card(
.page-card-summary.text-white .page-card-summary.text-white
| Join us for only $9.90/month! | 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 | Subscribe Now
| {% endif %} | {% endif %}

View File

@@ -5,7 +5,7 @@
| {% block og %} | {% block og %}
meta(property="og:title", content="Blender Cloud Statistics") 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')}}") meta(property="og:image", content="{{ url_for('static', filename='assets/img/backgrounds/background_andy_hdribot_01.jpg')}}")
| {% endblock %} | {% endblock %}

View File

@@ -8,7 +8,7 @@
| {% block og %} | {% block og %}
meta(property="og:title", content="Blender Cloud - Open Content Production Platform") 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')}}") meta(property="og:image", content="{{ url_for('static', filename='assets/img/backgrounds/background_dweebs_01.jpg')}}")
| {% endblock og %} | {% endblock og %}
@@ -70,7 +70,7 @@ li.pt-1.pr-1
improve it for everyone's benefit. improve it for everyone's benefit.
.page-card-side .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) video(autoplay, loop)
source(src="{{ url_for('static', filename='assets/img/features/animation_review_01.mp4')}}") 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 Access high quality content, organized in
#[a(href="{{ url_for('cloud.courses') }}") classes], #[a(href="{{ url_for('cloud.courses') }}") classes],
#[a(href="{{ url_for('cloud.workshops') }}") workshop] and the #[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 a curated artwork selection, where you can open a
.blend file and see how it was made. .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] | See #[a.learn(href="{{ url_for('cloud.courses') }}") Courses] & #[a.learn(href="{{ url_for('cloud.courses') }}") Workshops]
.page-card-side .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( img(
alt="Sybren teaches Python Scripting with Blender", alt="Sybren teaches Python Scripting with Blender",
src="{{ url_for('static', filename='assets/img/backgrounds/background_sybren_01.jpg')}}") 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 .page-triplet-container.homepage
.row .row
.col-md-4 .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 .triplet-card-thumbnail
img( img(
alt="Textures", alt="Textures",
@@ -130,11 +130,11 @@ li.pt-1.pr-1
h3 Minecraft Animation h3 Minecraft Animation
p. p.
Learn how to make animations with this workshop by Dillon Gu. 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 | LEARN MORE
.col-md-4 .col-md-4
.triplet-card(data-url="https://cloud.blender.org/p/motion-graphics/") .triplet-card(data-url="/p/motion-graphics/")
.triplet-card-thumbnail .triplet-card-thumbnail
img( img(
alt="HDRI", alt="HDRI",
@@ -143,11 +143,11 @@ li.pt-1.pr-1
h3 Motion Graphics h3 Motion Graphics
p. p.
A comprehensive guide to motion graphics techniques using Blender. 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 | LEARN MORE
.col-md-4 .col-md-4
.triplet-card(data-url="https://cloud.blender.org/p/gallery") .triplet-card(data-url="/p/gallery")
.triplet-card-thumbnail .triplet-card-thumbnail
img( img(
alt="Characters", alt="Characters",
@@ -156,25 +156,25 @@ li.pt-1.pr-1
h3 Art Walk-throughs h3 Art Walk-throughs
p. p.
Follow the creative process and techniques behind stunning artwork. 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 | LEARN MORE
.row.training-other .row.training-other
.col-md-10.col-md-offset-1 .col-md-10.col-md-offset-1
p. p.
Other training: Other training:
#[a(href="https://cloud.blender.org/p/toon-character-workflow/") Toon Character Workflow], #[a(href="/p/toon-character-workflow/") Toon Character Workflow],
#[a(href="https://cloud.blender.org/p/3d-printing/") Blender for 3D Printing], #[a(href="/p/3d-printing/") Blender for 3D Printing],
#[a(href="https://cloud.blender.org/p/game-asset-creation/") Game Asset Creation], #[a(href="/p/game-asset-creation/") Game Asset Creation],
#[a(href="https://cloud.blender.org/p/blenderella/") Character Modeling], #[a(href="/p/blenderella/") Character Modeling],
#[a(href="https://cloud.blender.org/p/character-animation/") Character Animation], #[a(href="/p/character-animation/") Character Animation],
#[a(href="https://cloud.blender.org/p/humane-rigging/") Introduction] and #[a(href="/p/humane-rigging/") Introduction] and
#[a(href="https://cloud.blender.org/p/blenrig/") Advanced Rigging], #[a(href="/p/blenrig/") Advanced Rigging],
#[a(href="https://cloud.blender.org/p/track-match-2/") VFX Workflow], #[a(href="/p/track-match-2/") VFX Workflow],
#[a(href="https://cloud.blender.org/p/creature-factory-2/") Creature] and #[a(href="/p/creature-factory-2/") Creature] and
#[a(href="https://cloud.blender.org/p/venoms-lab-2/") Cartoon Character creation], #[a(href="/p/venoms-lab-2/") Cartoon Character creation],
#[a(href="https://cloud.blender.org/p/chaos-evolution/") Advanced] #[a(href="/p/chaos-evolution/") Advanced]
#[a(href="https://cloud.blender.org/p/blend-and-paint/") Digital Painting] and #[a(href="/p/blend-and-paint/") Digital Painting] and
#[a(href="{{ url_for('cloud.courses') }}") much more]! #[a(href="{{ url_for('cloud.courses') }}") much more]!
@@ -215,7 +215,7 @@ li.pt-1.pr-1
.page-triplet-container.homepage .page-triplet-container.homepage
.row .row
.col-md-4 .col-md-4
.triplet-card(data-url="https://cloud.blender.org/p/hero/") .triplet-card(data-url="/p/hero/")
.triplet-card-thumbnail .triplet-card-thumbnail
img( img(
alt="Hero", alt="Hero",
@@ -224,11 +224,11 @@ li.pt-1.pr-1
h3 Hero h3 Hero
p. p.
The first ever Grease Pencil open movie made with Blender 2.8 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 | LEARN MORE
.col-md-4 .col-md-4
.triplet-card(data-url="https://cloud.blender.org/p/spring/") .triplet-card(data-url="/p/spring/")
.triplet-card-thumbnail .triplet-card-thumbnail
img( img(
alt="Spring", alt="Spring",
@@ -237,11 +237,11 @@ li.pt-1.pr-1
h3 Spring h3 Spring
p. p.
A poetic fantasy film. #[br] A stunning visual journey. 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 | LEARN MORE
.col-md-4 .col-md-4
.triplet-card(data-url="https://cloud.blender.org/p/caminandes-3/") .triplet-card(data-url="/p/caminandes-3/")
.triplet-card-thumbnail .triplet-card-thumbnail
img( img(
alt="Caminandes", alt="Caminandes",
@@ -250,21 +250,21 @@ li.pt-1.pr-1
h3 Caminandes h3 Caminandes
p. p.
Follow the adventures of Koro through the Patagonian pampas. 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 | LEARN MORE
.row.training-other .row.training-other
.col-md-10.col-md-offset-1 .col-md-10.col-md-offset-1
p. p.
Other open movies: Other open movies:
#[a(href="https://cloud.blender.org/p/elephants-dream/") Elephants Dream], #[a(href="/p/elephants-dream/") Elephants Dream],
#[a(href="https://cloud.blender.org/p/big-buck-bunny/") Big Buck Bunny], #[a(href="/p/big-buck-bunny/") Big Buck Bunny],
#[a(href="https://cloud.blender.org/p/sintel/") Sintel], #[a(href="/p/sintel/") Sintel],
#[a(href="https://cloud.blender.org/p/tears-of-steel/") Tears of Steel], #[a(href="/p/tears-of-steel/") Tears of Steel],
#[a(href="https://cloud.blender.org/p/cosmos-laundromat/") Cosmos Laundromat], #[a(href="/p/cosmos-laundromat/") Cosmos Laundromat],
#[a(href="https://cloud.blender.org/p/glass-half/") Glass Half], #[a(href="/p/glass-half/") Glass Half],
#[a(href="https://cloud.blender.org/p/dailydweebs/") The Daily Dweebs], #[a(href="/p/dailydweebs/") The Daily Dweebs],
#[a(href="https://cloud.blender.org/p/agent-327/") Agent 327] #[a(href="/p/agent-327/") Agent 327]
and #[a(href="{{ url_for('cloud.open_projects') }}") more] and #[a(href="{{ url_for('cloud.open_projects') }}") more]