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
*.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

View File

@@ -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):

View File

@@ -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
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 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

View File

@@ -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'

View File

@@ -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

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
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

View File

@@ -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

View File

@@ -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

View File

@@ -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 \

View File

@@ -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

View File

@@ -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',

View File

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

View File

@@ -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,

View File

@@ -9,3 +9,4 @@
-e ../attract
-e ../flamenco
-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
.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")

View File

@@ -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")

View File

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

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 %}
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")

View File

@@ -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")

View File

@@ -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 &nbsp;<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 &nbsp;<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 %}

View File

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

View File

@@ -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]