# patterns='*.js;*.css;*.jpg;*.jpeg;*.gif;*.png;*.svg;*.ttf;*.eot;*.woff;*.woff2'
# Staging
-pip install pandas xlwt
+# pip install pandas xlwt
# pip install -U https://forge.ircam.fr/p/django-eve/source/download/dev/
# pip install https://forge.ircam.fr/p/django-prestashop/source/download/master/ --src /srv/lib
# pip install -U https://github.com/stephenmcd/grappelli-safe/archive/dynamic_stacked.zip
'organization-network.PersonActivityTimeSheet'
)),
(_('Projects'), ('organization-projects.Project',
+ 'organization-projects.ProjectCall',
'organization-projects.ProjectProgram',
'organization-projects.ProjectProgramType',
'organization-projects.ProjectTopic',
from organization.pages.models import Page
from organization.network.models import Organization, OrganizationLinkedInline
from mezzanine.utils.sites import current_site_id
+from django.contrib.sites.models import Site
def settings(request):
newsletter_subscribing_url = newsletter_page.first().get_absolute_url()
# HOST ORGANIZATIONS
- host_org = Organization.objects.filter(is_host=True).first()
+ try:
+ site = Site.objects.get(id=current_site_id())
+ host_org = Organization.objects.get(site=site)
+ except:
+ try:
+ host_org = Organization.objects.filter(is_host=True).first()
+ except:
+ host_org = Organization.objects.first()
+
organization_lists = []
for orga_linked_block in host_org.organization_linked_block.all():
abstract = True
-class Named(models.Model):
- """Abstract model providing a name field"""
+class NamedOnly(models.Model):
+ """Abstract model providing a name field only"""
name = models.CharField(_('name'), max_length=512)
- description = models.TextField(_('description'), blank=True)
class Meta:
abstract = True
return slugify(self.__unicode__())
+class Named(NamedOnly):
+ """Abstract model providing a name field and a description"""
+
+ description = models.TextField(_('description'), blank=True)
+
+ class Meta:
+ abstract = True
+ ordering = ['name',]
+
+
class Titled(models.Model):
"""Abstract model providing a title field"""
return value
+class SimpleImage(Titled, Orderable):
+
+ file = models.FileField(_("Image"), max_length=1024, upload_to="images")
+ credits = models.CharField(_('credits'), max_length=256, blank=True, null=True)
+
+ class Meta:
+ abstract = True
+
+ def __str__(self):
+ value = self.description
+ if not value:
+ value = self.file.name
+ if not value:
+ value = ""
+ return value
+
+
class File(Titled, Orderable):
file = FileField(_("document"), max_length=1024, upload_to="Documents/%Y/%m/%d/")
from mezzanine_agenda.models import Event
from organization.pages.models import CustomPage
from organization.projects.models import Project
+from extra_views import CreateWithInlinesView, UpdateWithInlinesView, InlineFormSet
+
class SlugMixin(object):
from organization.shop.models import PageProductList
from organization.network.utils import TimesheetXLS, set_timesheets_validation_date
+
class OrganizationAdminInline(StackedDynamicInlineAdmin):
model = OrganizationLinkedInline
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-03-03 15:37
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django_countries.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-network', '0088_organization_site'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='person',
+ name='address',
+ field=models.TextField(blank=True, verbose_name='address'),
+ ),
+ migrations.AddField(
+ model_name='person',
+ name='city',
+ field=models.CharField(blank=True, max_length=255, null=True, verbose_name='city'),
+ ),
+ migrations.AddField(
+ model_name='person',
+ name='country',
+ field=django_countries.fields.CountryField(blank=True, max_length=2, null=True, verbose_name='country'),
+ ),
+ migrations.AddField(
+ model_name='person',
+ name='postal_code',
+ field=models.CharField(blank=True, max_length=16, null=True, verbose_name='postal code'),
+ ),
+ ]
team = models.ForeignKey(Team, verbose_name=_('team'), related_name='links', blank=True, null=True, on_delete=models.SET_NULL)
-class Person(Displayable, AdminThumbMixin):
+class Person(Displayable, AdminThumbMixin, Address):
"""(Person description)"""
user = models.OneToOneField(User, verbose_name=_('user'), blank=True, null=True, on_delete=models.SET_NULL)
model = ProjectBlogPage
+class ProjectSimpleImageInline(StackedDynamicInlineAdmin):
+
+ model = ProjectSimpleImage
+
+
+class ProjectContactInline(StackedDynamicInlineAdmin):
+
+ model = ProjectContact
+
+
class ProjectAdmin(admin.ModelAdmin):
model = Project
-class ICTProjectAdmin(admin.ModelAdmin):
+class ProjectICTDataInline(StackedDynamicInlineAdmin):
- model = ICTProject
+ model = ProjectICTData
class ProjectRelatedTitleAdmin(TranslationTabularInline):
fieldsets = deepcopy(ProjectAdmin.fieldsets)
inlines = [ ProjectBlockInline,
+ ProjectContactInline,
+ ProjectSimpleImageInline,
ProjectImageInline,
+ ProjectICTDataInline,
ProjectWorkPackageInline,
ProjectPlaylistInline,
ProjectLinkInline,
ProjectFileInline,
ProjectRelatedTitleAdmin,
DynamicContentProjectInline,
- ProjectBlogPageInline,]
+ ProjectBlogPageInline,
+ ]
filter_horizontal = ['teams', 'organizations']
list_filter = ['type', 'program', 'program_type', null_filter('external_id')]
list_display = ['title', 'external_id', 'date_from', 'date_to', 'status', 'admin_link']
-class ICTProjectAdminDisplayable(DisplayableAdmin):
-
- fieldsets = deepcopy(ICTProjectAdmin.fieldsets)
- inlines = [ ProjectBlockInline,
- ProjectImageInline,
- ProjectWorkPackageInline,
- ProjectPlaylistInline,
- ProjectLinkInline,
- ProjectFileInline,
- ProjectRelatedTitleAdmin,
- DynamicContentProjectInline,
- ProjectBlogPageInline,]
- filter_horizontal = ['contact']
- list_filter = ['validation_status', null_filter('external_id')]
- list_display = ['title', 'external_id', 'date_from', 'date_to', 'status', 'admin_link']
-
-
class ProjectTopicAdmin(BaseTranslationModelAdmin):
model = ProjectTopic
list_filter = ['project', 'date_from', 'date_to', 'lead_organization' ]
-class ICTProjectAdmin(admin.ModelAdmin):
+class ProjectCallAdmin(admin.ModelAdmin):
+
+ model = ProjectCall
+
+
+class ProjectCallBlockInline(StackedDynamicInlineAdmin):
+
+ model = ProjectCallBlock
+
+
+class ProjectCallLinkInline(StackedDynamicInlineAdmin):
+
+ model = ProjectCallLink
+
+
+class ProjectCallImageInline(StackedDynamicInlineAdmin):
+
+ model = ProjectCallImage
+
+
+class ProjectCallFileInline(StackedDynamicInlineAdmin):
+
+ model = ProjectCallFile
+
+
+class ProjectCallAdminDisplayable(DisplayableAdmin):
- model = ICTProject
+ fieldsets = deepcopy(ProjectCallAdmin.fieldsets)
+ inlines = [ ProjectCallBlockInline,
+ ProjectCallImageInline,
+ ProjectCallLinkInline,
+ ProjectCallFileInline,
+ ]
+ list_display = ['title', 'date_from', 'date_to', 'status', 'admin_link']
admin.site.register(Project, ProjectAdminDisplayable)
admin.site.register(Repository)
admin.site.register(RepositorySystem)
admin.site.register(ProjectWorkPackage, ProjectWorkPackageAdmin)
-admin.site.register(ICTProject, ICTProjectAdmin)
+admin.site.register(ProjectCall, ProjectCallAdminDisplayable)
from organization.pages.models import CustomPage
from organization.agenda.models import Event, DynamicContentEvent
from organization.media.models import Playlist
-from organization.projects.models import DynamicContentProject
+from organization.projects.models import *
+from extra_views import InlineFormSet
class DynamicContentProjectForm(autocomplete.FutureModelForm):
class Meta:
model = DynamicContentProject
fields = ('content_object',)
+
+
+class ProjectForm(ModelForm):
+
+ class Meta:
+ model = Project
+ fields = ('title', 'description', 'keywords', 'website')
+
+
+class ProjectICTForm(ModelForm):
+
+ class Meta:
+ model = Project
+ exclude = ('external_id', '_meta_title')
+
+
+class ProjectICTDataInline(InlineFormSet):
+
+ max_num = 1
+ model = ProjectICTData
+ exclude = ('validation_status', )
+
+
+class ProjectSimpleImageInline(InlineFormSet):
+
+ max_num = 3
+ model = ProjectSimpleImage
+ fields = ('file', 'credits')
+
+
+class ProjectContactInline(InlineFormSet):
+
+ max_num = 1
+ model = ProjectContact
+ fields = ('gender', 'person_title', 'first_name', 'last_name', 'address', 'email', 'telephone', 'bio', 'address', 'postal_code', 'city', 'country')
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-03-03 14:57
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import mezzanine.core.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-network', '0088_organization_site'),
+ ('sites', '0002_alter_domain_unique'),
+ ('organization-core', '0005_linktype_fa_option'),
+ ('organization-projects', '0043_auto_20170214_1643'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='ProjectCallBlock',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('content', mezzanine.core.fields.RichTextField(verbose_name='Content')),
+ ('content_fr', mezzanine.core.fields.RichTextField(null=True, verbose_name='Content')),
+ ('content_en', mezzanine.core.fields.RichTextField(null=True, verbose_name='Content')),
+ ('_order', mezzanine.core.fields.OrderField(null=True, verbose_name='Order')),
+ ('title', models.CharField(max_length=1024, verbose_name='title')),
+ ('title_fr', models.CharField(max_length=1024, null=True, verbose_name='title')),
+ ('title_en', models.CharField(max_length=1024, null=True, verbose_name='title')),
+ ('description', models.TextField(blank=True, verbose_name='description')),
+ ('description_fr', models.TextField(blank=True, null=True, verbose_name='description')),
+ ('description_en', models.TextField(blank=True, null=True, verbose_name='description')),
+ ('with_separator', models.BooleanField(default=False)),
+ ('background_color', models.CharField(blank=True, choices=[('black', 'black'), ('yellow', 'yellow'), ('red', 'red'), ('white', 'white')], max_length=32, verbose_name='background color')),
+ ('login_required', models.BooleanField(default=False, verbose_name='login required')),
+ ],
+ options={
+ 'ordering': ('_order',),
+ },
+ ),
+ migrations.CreateModel(
+ name='ProjectCallFile',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('_order', mezzanine.core.fields.OrderField(null=True, verbose_name='Order')),
+ ('title', models.CharField(max_length=1024, verbose_name='title')),
+ ('description', models.TextField(blank=True, verbose_name='description')),
+ ('file', mezzanine.core.fields.FileField(max_length=1024, verbose_name='document')),
+ ],
+ options={
+ 'ordering': ('_order',),
+ },
+ ),
+ migrations.CreateModel(
+ name='ProjectCallImage',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('_order', mezzanine.core.fields.OrderField(null=True, verbose_name='Order')),
+ ('title', models.CharField(max_length=1024, verbose_name='title')),
+ ('description', models.TextField(blank=True, verbose_name='description')),
+ ('file', mezzanine.core.fields.FileField(max_length=1024, verbose_name='Image')),
+ ('credits', models.CharField(blank=True, max_length=256, null=True, verbose_name='credits')),
+ ('type', models.CharField(choices=[('logo', 'logo'), ('logo_white', 'logo white'), ('logo_black', 'logo black'), ('logo_header', 'logo header'), ('logo_footer', 'logo footer'), ('slider', 'slider'), ('card', 'card'), ('page_slider', 'page - slider'), ('page_featured', 'page - featured')], max_length=64, verbose_name='type')),
+ ],
+ options={
+ 'ordering': ('_order',),
+ },
+ ),
+ migrations.CreateModel(
+ name='ProjectCallLink',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('url', models.URLField(blank=True, max_length=512, verbose_name='URL')),
+ ('title', models.CharField(blank=True, max_length=1024, null=True, verbose_name='title')),
+ ('title_fr', models.CharField(blank=True, max_length=1024, null=True, verbose_name='title')),
+ ('title_en', models.CharField(blank=True, max_length=1024, null=True, verbose_name='title')),
+ ],
+ options={
+ 'verbose_name_plural': 'links',
+ 'abstract': False,
+ 'verbose_name': 'link',
+ },
+ ),
+ migrations.CreateModel(
+ name='ProjectICTData',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('affiliation', models.CharField(max_length=512, verbose_name='affiliation')),
+ ('short_description', models.CharField(help_text='Very short description of challenge / technology (110 characters max)', max_length=110, verbose_name='short description')),
+ ('technology_description', models.TextField(help_text='Description of the project technology to be made available to artists + challenges it produces (100-200 words) ', verbose_name='technology description')),
+ ('challenges_description', models.TextField(help_text='Description of the challenges faced by the ICT-Project (100-150 words).', verbose_name='challenges description')),
+ ('objectives_description', models.TextField(help_text='What the project is looking to gain from the collaboration and what kind of artist would be suitable (100 – 150 words)', verbose_name='challenges description')),
+ ('resources_description', models.TextField(help_text='Resources available to the artist (50 – 100 words) -- e.g. office facility, studio facility, technical equipment, internet connection, laboratory, and periods of availability for artistic production, staff possibly allocated to the project, available budget for travel, consumables and equipments, etc.).', verbose_name='resources description')),
+ ('letter', models.TextField(verbose_name='letter of commitment')),
+ ('validation_status', models.IntegerField(choices=[(0, 'pending'), (1, 'accepted'), (2, 'rejected'), (3, 'in process')], verbose_name='validation status')),
+ ('contact', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ict_projects_contact_person', to='organization-network.Person', verbose_name='Contact Person')),
+ ],
+ options={
+ 'verbose_name_plural': 'Project ICT data',
+ 'verbose_name': 'Project ICT data',
+ },
+ ),
+ migrations.AlterModelOptions(
+ name='projectcall',
+ options={'ordering': ['title', 'name'], 'verbose_name': 'project call', 'verbose_name_plural': 'project calls'},
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='_meta_title',
+ field=models.CharField(blank=True, help_text='Optional title to be used in the HTML title tag. If left blank, the main title field will be used.', max_length=500, null=True, verbose_name='Title'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='content',
+ field=mezzanine.core.fields.RichTextField(default='', verbose_name='Content'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='content_en',
+ field=mezzanine.core.fields.RichTextField(null=True, verbose_name='Content'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='content_fr',
+ field=mezzanine.core.fields.RichTextField(null=True, verbose_name='Content'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='created',
+ field=models.DateTimeField(editable=False, null=True),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='date_from',
+ field=models.DateField(blank=True, null=True, verbose_name='begin date'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='date_to',
+ field=models.DateField(blank=True, null=True, verbose_name='end date'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='description_en',
+ field=models.TextField(blank=True, null=True, verbose_name='Description'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='description_fr',
+ field=models.TextField(blank=True, null=True, verbose_name='Description'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='expiry_date',
+ field=models.DateTimeField(blank=True, help_text="With Published chosen, won't be shown after this time", null=True, verbose_name='Expires on'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='gen_description',
+ field=models.BooleanField(default=True, help_text='If checked, the description will be automatically generated from content. Uncheck if you want to manually set a custom description.', verbose_name='Generate description'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='in_sitemap',
+ field=models.BooleanField(default=True, verbose_name='Show in sitemap'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='keywords_string',
+ field=models.CharField(blank=True, editable=False, max_length=500),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='publish_date',
+ field=models.DateTimeField(blank=True, db_index=True, help_text="With Published chosen, won't be shown until this time", null=True, verbose_name='Published from'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='short_url',
+ field=models.URLField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='site',
+ field=models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.Site'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='slug',
+ field=models.CharField(blank=True, help_text='Leave blank to have the URL auto-generated from the title.', max_length=2000, null=True, verbose_name='URL'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='status',
+ field=models.IntegerField(choices=[(1, 'Draft'), (2, 'Published')], default=2, help_text='With Draft chosen, will only be shown for admin users on the site.', verbose_name='Status'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='title',
+ field=models.CharField(default='', max_length=500, verbose_name='Title'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='title_en',
+ field=models.CharField(max_length=500, null=True, verbose_name='Title'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='title_fr',
+ field=models.CharField(max_length=500, null=True, verbose_name='Title'),
+ ),
+ migrations.AddField(
+ model_name='projectcall',
+ name='updated',
+ field=models.DateTimeField(editable=False, null=True),
+ ),
+ migrations.AlterField(
+ model_name='project',
+ name='type',
+ field=models.CharField(choices=[('internal', 'internal'), ('external', 'external'), ('ICT', 'ICT')], max_length=128, verbose_name='type'),
+ ),
+ migrations.AlterField(
+ model_name='projectcall',
+ name='description',
+ field=models.TextField(blank=True, verbose_name='Description'),
+ ),
+ migrations.AddField(
+ model_name='projectictdata',
+ name='project',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ict_data', to='organization-projects.Project', verbose_name='project'),
+ ),
+ migrations.AddField(
+ model_name='projectcalllink',
+ name='call',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='links', to='organization-projects.ProjectCall', verbose_name='project call link'),
+ ),
+ migrations.AddField(
+ model_name='projectcalllink',
+ name='link_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organization-core.LinkType', verbose_name='link type'),
+ ),
+ migrations.AddField(
+ model_name='projectcallimage',
+ name='call',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='images', to='organization-projects.ProjectCall', verbose_name='project call image'),
+ ),
+ migrations.AddField(
+ model_name='projectcallfile',
+ name='call',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='files', to='organization-projects.ProjectCall', verbose_name='project call file'),
+ ),
+ migrations.AddField(
+ model_name='projectcallblock',
+ name='call',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='blocks', to='organization-projects.ProjectCall', verbose_name='project call blocks'),
+ ),
+ ]
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-03-03 15:05
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import mezzanine.core.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-network', '0088_organization_site'),
+ ('organization-projects', '0044_auto_20170303_1557'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='ProjectContact',
+ fields=[
+ ('person_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='organization-network.Person')),
+ ('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contacts', to='organization-projects.Project', verbose_name='project')),
+ ],
+ options={
+ 'verbose_name': 'Project contact',
+ 'verbose_name_plural': 'Project contacts',
+ },
+ bases=('organization-network.person',),
+ ),
+ migrations.CreateModel(
+ name='ProjectSimpleImage',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('_order', mezzanine.core.fields.OrderField(null=True, verbose_name='Order')),
+ ('title', models.CharField(max_length=1024, verbose_name='title')),
+ ('description', models.TextField(blank=True, verbose_name='description')),
+ ('file', mezzanine.core.fields.FileField(max_length=1024, verbose_name='Image')),
+ ('credits', models.CharField(blank=True, max_length=256, null=True, verbose_name='credits')),
+ ('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='simple_images', to='organization-projects.Project', verbose_name='project')),
+ ],
+ options={
+ 'ordering': ('_order',),
+ },
+ ),
+ migrations.AlterField(
+ model_name='projectictdata',
+ name='objectives_description',
+ field=models.TextField(help_text='What the project is looking to gain from the collaboration and what kind of artist would be suitable (100 – 150 words)', verbose_name='objectives description'),
+ ),
+ ]
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-03-03 15:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-projects', '0045_auto_20170303_1605'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='projectsimpleimage',
+ name='file',
+ field=models.FileField(max_length=1024, upload_to='images', verbose_name='Image'),
+ ),
+ ]
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-03-03 16:38
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-projects', '0046_auto_20170303_1631'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='projectictdata',
+ name='contact',
+ ),
+ ]
PROJECT_TYPE_CHOICES = [
('internal', _('internal')),
('external', _('external')),
+ ('ICT', _('ICT')),
]
-ACCESS_CHOICES = [
+REPOSITORY_ACCESS_CHOICES = [
('public', _('public')),
('shared', _('shared')),
('private', _('private')),
(3, _('in process'))
)
+
class Project(Displayable, Period, RichText):
"""(Project description)"""
ordering = ['name',]
-class ProjectCall(Named):
-
- class Meta:
- verbose_name = _('project call')
- verbose_name_plural = _("project calls")
- ordering = ['name',]
-
-
class ProjectWorkPackage(Titled, Period):
project = models.ForeignKey(Project, verbose_name=_('project'), related_name='work_packages')
project = models.ForeignKey(Project, verbose_name=_('project'), related_name='images', blank=True, null=True, on_delete=models.SET_NULL)
+class ProjectSimpleImage(SimpleImage):
+
+ project = models.ForeignKey(Project, verbose_name=_('project'), related_name='simple_images', blank=True, null=True, on_delete=models.SET_NULL)
+
+
class ProjectFile(File):
project = models.ForeignKey(Project, verbose_name=_('project'), related_name='files', blank=True, null=True, on_delete=models.SET_NULL)
verbose_name_plural = _("project topic pages")
+class ProjectCall(Displayable, Period, RichText, NamedOnly):
+
+ class Meta:
+ verbose_name = _('project call')
+ verbose_name_plural = _("project calls")
+ ordering = ['title', 'name',]
+
+ def __str__(self):
+ return self.title
+
+ def get_absolute_url(self):
+ return reverse("organization-call-detail", kwargs={"slug": self.slug})
+
+
+class ProjectCallBlock(Block):
+
+ call = models.ForeignKey(ProjectCall, verbose_name=_('project call blocks'), related_name='blocks', blank=True, null=True, on_delete=models.SET_NULL)
+
+
+class ProjectCallImage(Image):
+
+ call = models.ForeignKey(ProjectCall, verbose_name=_('project call image'), related_name='images', blank=True, null=True, on_delete=models.SET_NULL)
+
+
+class ProjectCallFile(File):
+
+ call = models.ForeignKey(ProjectCall, verbose_name=_('project call file'), related_name='files', blank=True, null=True, on_delete=models.SET_NULL)
+
+
+class ProjectCallLink(Link):
+
+ call = models.ForeignKey(ProjectCall, verbose_name=_('project call link'), related_name='links', blank=True, null=True, on_delete=models.SET_NULL)
+
+
class ProjectDemo(Displayable, RichText, URL):
project = models.ForeignKey('Project', verbose_name=_('project'), related_name='demos', blank=True, null=True, on_delete=models.SET_NULL)
class Repository(Named):
system = models.ForeignKey('RepositorySystem', verbose_name=_('system'), related_name='repositories')
- access = models.CharField(_('access'), max_length=64, choices=ACCESS_CHOICES, default='private')
+ access = models.CharField(_('access'), max_length=64, choices=REPOSITORY_ACCESS_CHOICES, default='private')
branch = models.CharField(_('branch'), max_length=32, default='master')
url = models.CharField(_('URL'), max_length=256, help_text='http(s) or ssh')
return reverse("organization-project-blogpage-detail", kwargs={"slug": self.slug})
-class ICTProject(Displayable, Period, RichText):
+class ProjectICTData(models.Model):
+
+ project = models.ForeignKey(Project, verbose_name=_('project'), related_name='ict_data', blank=True, null=True, on_delete=models.SET_NULL)
# Public
- # Already in Displayable #name = models.CharField(_('name'), blank=True, max_length=512)
- # Already in Displayable #website = models.URLField(_('website'), max_length=512, blank=True)
- affiliation = models.CharField(_('affiliation'), blank=True, max_length=512)
- short_description = models.TextField(_('short description'), blank=True, max_length=128)
- # Already in Displayable #project_description = models.TextField(_('project description'), blank=True, max_length=128)
- technology_description = models.TextField(_('technology description'), blank=True, max_length=256)
- challenges_description = models.TextField(_('challenges description'), blank=True, max_length=256)
- objectives_description = models.TextField(_('challenges description'), blank=True, max_length=256)
- resources_description = models.TextField(_('resources description'), blank=True, max_length=256)
- # Defined as objectives_description # What the project is looking to gain from the collaboration and what kind of artist would be suitable (100 – 150 words)
- # Defined as resources_description # Resources available to the artist (50 – 100 words) -- e.g. office facility, studio facility, technical equipment, internet connection, laboratory, and periods of availability for artistic production, staff possibly allocated to the project, available budget for travel, consumables and equipments, etc.).
- # Already in Displayable # 5 key words to describe project and challenge
- #TODO: Inherit from ProjectImage or in inlines? # 3 key images for inspiring the artists + any video content available
- # Already in Period # Possible period of implementation -- (must be part of the project implementation workplan)
+ affiliation = models.CharField(_('affiliation'), max_length=512)
+ short_description = models.CharField(_('short description'), max_length=110, help_text="Very short description of challenge / technology (110 characters max)")
+ technology_description = models.TextField(_('technology description'), help_text="Description of the project technology to be made available to artists + challenges it produces (100-200 words) ")
+ challenges_description = models.TextField(_('challenges description'), help_text="Description of the challenges faced by the ICT-Project (100-150 words).")
+ objectives_description = models.TextField(_('objectives description'), help_text="What the project is looking to gain from the collaboration and what kind of artist would be suitable (100 – 150 words)")
+ resources_description = models.TextField(_('resources description'), help_text="Resources available to the artist (50 – 100 words) -- e.g. office facility, studio facility, technical equipment, internet connection, laboratory, and periods of availability for artistic production, staff possibly allocated to the project, available budget for travel, consumables and equipments, etc.).")
# Private
- contact = models.ManyToManyField('organization-network.Person', verbose_name=_('Contact Person'), related_name='ict_projects_contact_person', blank=True)
- letter = models.TextField(_('letter of commitment'), blank=True, max_length=1024)
- external_id = models.CharField(_('external ID'), blank=True, null=True, max_length=128)
+ letter = models.TextField(_('letter of commitment'))
validation_status = models.IntegerField(_('validation status'), choices=PROJECT_STATUS_CHOICES)
class Meta:
- verbose_name = _('ICT project')
- verbose_name_plural = _('ICT projects')
- ordering = ['-date_from', '-date_to']
+ verbose_name = 'Project ICT data'
+ verbose_name_plural = 'Project ICT data'
- def __str__(self):
- return self.title
- def get_absolute_url(self):
- return reverse("ict-project-detail", kwargs={"slug": self.slug})
+class ProjectContact(Person):
- def project_status(self):
- return self.validation_status
+ project = models.ForeignKey(Project, verbose_name=_('project'), related_name='contacts', blank=True, null=True, on_delete=models.SET_NULL)
+
+ class Meta:
+ verbose_name = 'Project contact'
+ verbose_name_plural = 'Project contacts'
pass
+@register(ProjectSimpleImage)
+class ProjectSimpleImageTranslationOptions(TranslationOptions):
+
+ pass
+
+
@register(ProjectFile)
class ProjectFileTranslationOptions(TranslationOptions):
class DynamicContentProjectTranslationOptions(TranslationOptions):
fields = ()
+
+
+@register(ProjectICTData)
+class ProjectICTDataTranslationOptions(TranslationOptions):
+
+ pass
+
+
+@register(ProjectCall)
+class ProjectCallTranslationOptions(TranslationOptions):
+
+ fields = ('title', 'description', 'content')
+
+
+@register(ProjectCallBlock)
+class ProjectCallBlockTranslationOptions(TranslationOptions):
+
+ fields = ('title', 'description', 'content')
+
+
+@register(ProjectCallImage)
+class ProjectCallImageTranslationOptions(TranslationOptions):
+
+ pass
+
+
+@register(ProjectCallLink)
+class ProjectCallLinkTranslationOptions(TranslationOptions):
+
+ fields = ('title',)
+
+
+@register(ProjectCallFile)
+class ProjectCallFileTranslationOptions(TranslationOptions):
+
+ pass
+
+@register(ProjectContact)
+class ProjectContactTranslationOptions(TranslationOptions):
+
+ pass
url("^dynamic-content-project/$", permission_required('project.can_edit')(DynamicContentProjectView.as_view()), name='dynamic-content-project'),
url("^project/demo/(?P<slug>.*)/$", ProjectDemoDetailView.as_view(), name='organization-project-demo-detail'),
url("^project/blog/(?P<slug>.*)/$", ProjectBlogPageView.as_view(), name='organization-project-blogpage-detail'),
+ url("^project/ict/create/$", ProjectICTCreateView.as_view(), name='organization-project-create'),
+ url("^call/detail/(?P<slug>.*)/$", ProjectCallDetailView.as_view(), name='organization-call-detail'),
+ url("^call/list/$", ProjectCallListView.as_view(), name='organization-call-list'),
]
from mezzanine_agenda.models import Event
from mezzanine.conf import settings
from organization.projects.models import *
+from organization.projects.forms import *
from organization.core.views import *
from organization.magazine.views import Article
from organization.pages.models import CustomPage
model = ProjectBlogPage
template_name='projects/project_blogpage_detail.html'
+
+
+class ProjectICTDetailView(SlugMixin,DetailView):
+
+ model = Project
+ template_name='projects/project_ict_detail.html'
+
+
+class ProjectICTCreateView(CreateWithInlinesView):
+
+ model = Project
+ form_class = ProjectForm
+ template_name='projects/project_ict_create.html'
+ inlines = [ProjectICTDataInline, ProjectSimpleImageInline, ProjectContactInline,]
+
+
+class ProjectCallDetailView(SlugMixin, DetailView):
+
+ model = ProjectCall
+ template_name='projects/project_call_detail.html'
+
+
+class ProjectCallListView(SlugMixin, ListView):
+
+ model = ProjectCall
+ template_name='projects/project_call_list.html'
--- /dev/null
+{% extends "pages/page.html" %}
+{% load mezzanine_tags keyword_tags i18n organization_tags pages_tags %}
+
+{% block meta_title %}{{ object.meta_title }}{% endblock %}
+
+{% block meta_keywords %}{% metablock %}
+{% keywords_for object as keywords %}
+{% for keyword in keywords %}
+ {% if not forloop.first %}, {% endif %}
+ {{ keyword }}
+{% endfor %}
+{% endmetablock %}{% endblock %}
+
+{% block page_class %}
+ object
+{% endblock %}
+
+{% block body_class %}
+ pattern pattern-bg {{ department.pages.all.0.weaving_css_class }}
+{% endblock %}
+
+{% block breadcrumb_menu %}
+ {{ block.super }}
+ <li class="breadcrumb__item active">{{ object.title }}</li>
+{% endblock %}
+
+{% block page_tags %}
+
+ {% comment %}
+ {% if department %}
+ <div class="tag dashed dashed--yellow">
+ {{ department.pages.all.0.title }}
+ </div>
+ {% endif %}
+ <div class="tag tag--category">
+ {% trans 'Project' %}
+ </div>
+ {% endcomment %}
+
+{% endblock %}
+
+{% block page_title %}
+
+ {% editable object.title %}
+ <h1 class="dotted">{{ object.title }}</h1>
+ {% endeditable %}
+
+ {% with page.get_ascendants|last as top_level_parent %}
+ {% if linked_organization_content and research_slug == top_level_parent.slug %}
+ {% include 'pages/page/includes/linked_organization_content.html' %}
+ {% endif %}
+ {% endwith %}
+
+ {% if object.description %}
+ {% editable object.description %}
+ <div class="chapo">
+ {{ object.description }}
+ </div>
+ {% endeditable %}
+ {% endif %}
+
+{% endblock %}
+
+{% block page_content %}
+ {% if object.content %}
+ {% editable object.content %}
+ {{ object.content|richtext_filters|safe }}
+ {% endeditable %}
+ {% endif %}
+{% endblock %}
+
+{% block page_sidebar %}
+ <ul class="nav-tree nav-tree--level-{{ branch_level }}" data-sticky data-sticky-parent="row" data-sticky-offset="100" data-sticky-detach-at="971">
+ <li class="nav-tree__item">
+ <a class="nav-tree__link" href="{{ page.get_ascendants.0.get_absolute_url }}">{% trans "Home" %}</a>
+ </li>
+ <li class="nav-tree__item">
+ <a class="nav-tree__link" href="{{ page.get_absolute_url }}">{{ page.title }}</a>
+ </li>
+ <li class="nav-tree__item">
+ <a class="nav-tree__link active" href="{{ page.get_absolute_url }}">{{ object.title }}</a>
+ <ul class="nav-tree" data-summary>
+ <li class="nav-tree__item nav-tree__item--sub hide">
+ <a class="nav-tree__link nav-tree__link--sub" href="#"></a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+{% endblock %}
+
+{% block page_link %}
+ {% with object.links.all as links %}
+ {% if links %}
+ {% include 'core/inc/link.html' %}
+ {% endif %}
+ {% endwith %}
+{% endblock %}
+
+{% block page_audio %}
+ {% with object as object %}
+ {{ block.super }}
+ {% endwith %}
+{% endblock %}
+
+{% block page_slider %}
+ {% with object as object %}
+ {{ block.super }}
+ {% endwith %}
+{% endblock %}
+
+{% block page_video %}
+ {% with object as object %}
+ {{ block.super }}
+ {% endwith %}
+{% endblock %}
+
+{% block page_sub_content %}
+
+ {% if object.type == 'external' %}
+ <div class="white-bg pb2">
+ <hr class="mt0 invisible" />
+ <div class="page__block page__block--yellow">
+ <div class="container">
+ <div class="row">
+ <div class="col-sm-12 col-lg-10 col-lg-push-1">
+ <div class="row">
+ <div class="col-sm-6">
+ <div class="project-details">
+ <h3 class="dotted project-details__title">{% trans "Project details" %}</h3>
+
+ <div>
+ {% if object.program %}
+ <div class="project-details__item">
+ <div class="project-details__item-title">
+ {% trans "Program" %}
+ </div>
+ <div class="project-details__item-desc">
+ {{ object.program }}
+ </div>
+ </div>
+ {% endif %}
+
+ {% if object.program_type %}
+ <div class="project-details__item">
+ <div class="project-details__item-title">
+ {% trans "Program type" %}
+ </div>
+ <div class="project-details__item-desc">
+ {{ object.program_type }}
+ </div>
+ </div>
+ {% endif %}
+
+ <div class="project-details__item">
+ <div class="project-details__item-title">
+ {% trans "Beginning" %}
+ </div>
+ <div class="project-details__item-desc">
+ {{ object.date_from }}
+ </div>
+ </div>
+
+ <div class="project-details__item">
+ <div class="project-details__item-title">
+ {% trans "End" %}
+ </div>
+ <div class="project-details__item-desc">
+ {{ object.date_to }}
+ </div>
+ </div>
+
+ <div class="project-details__item">
+ <div class="project-details__item-title">
+ {% trans "Status" %}
+ </div>
+ <div class="project-details__item-desc">
+ {{ object.object_status }}
+ </div>
+ </div>
+
+ {% if object.website %}
+ <div class="project-details__item">
+ <div class="project-details__item-title">
+ {% trans "Website" %}
+ </div>
+ <div class="project-details__item-desc">
+ <a href="{{ object.website }}" target="_blank" title="{{ object.title }}">{{ object.website }}</a>
+ </div>
+ </div>
+ {% endif %}
+
+ <div class="project-details__logo">
+ {% with object.images.all|get_type:'logo' as images %}
+ {% include 'core/inc/logo.html' %}
+ {% endwith %}
+ </div>
+
+ </div>
+ </div>
+ </div>
+ <div class="col-sm-6">
+ <div class="project-details">
+ <h3 class="dotted project-details__title">{% trans "Participants" %}</h3>
+
+ <div>
+
+ {% if object.lead_team or object.lead_organization %}
+ <div class="project-details__item">
+ {% if object.lead_team %}
+ <div class="project-details__item-title">
+ {% trans "Project lead team" %}
+ </div>
+ <div class="project-details__item-desc">
+ <a href="{% url "page" object.lead_team.pages.all.0 %}">{{ object.lead_team.short }}</a>
+ </div>
+ {% elif object.lead_organization %}
+ <div class="project-details__item-title">
+ {% trans "Project lead organization" %}
+ </div>
+ <div class="project-details__item-desc">
+ {% if object.lead_organization.url %}
+ <a href="{{ object.lead_organization.url }}" target="_blank" title="{{ object.lead_organization }}">
+ {% endif %}
+ {{ object.lead_organization }}
+ {% if object.lead_organization.url %}
+ </a>
+ {% endif %}
+ </div>
+ {% endif %}
+ </div>
+ {% endif %}
+
+ <div class="project-details__item">
+ <div class="project-details__item-title">
+ {% trans "Partners" %}
+ </div>
+ <div class="project-details__item-desc">
+ {% for organization in object.organizations.all %}
+ {% if organization.url %}
+ <a href="{{ organization.url }}" target="_blank" title="{{ organization }}">
+ {% endif %}
+ {{ organization }}<br>
+ {% if organization.url %}
+ </a>
+ {% endif %}
+ {% endfor %}
+ </div>
+
+ <div class="project-details__item-title">
+ {% trans "teams" %} ({{ host_organization }})
+ </div>
+ <div class="project-details__item-desc">
+ {% for team in object.teams.all %}
+ {% if team.pages.all %}
+ <a href="{% url "page" team.pages.all.0.slug %}">{{ team.short }}</a><br>
+ {% endif %}
+ {% endfor %}
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ {% endif %}
+
+ {% with object.blocks.all as blocks %}
+ {% include "projects/inc/project_block.html" %}
+ {% endwith %}
+{% endblock %}
+
+{% block page_demo %}
+{% if object.demos.all %}
+<div class="page__block{% if block.background_color %} page__block--{{ block.background_color }}{% endif %}">
+ <hr class="mt0">
+ <div class="white-bg mb2">
+ <div class="container">
+ <div class="row" data-summary-content>
+ <div class="col-sm-9 col-sm-push-3 col-lg-8 col-lg-push-2">
+ <ul>
+ <h2>{% trans "Demos" %}</h2>
+ {% for demo in object.demos.all %}
+ <li><a href="{% url 'organization-project-demo-detail' demo.slug %}">{{ demo.title }}</a></li>
+ {% endfor %}
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+{% endif %}
+{% endblock %}
+
+{% block page_blog %}
+{% if object.blog_pages.all %}
+<div class="page__block{% if block.background_color %} page__block--{{ block.background_color }}{% endif %}">
+ <hr class="mt0">
+ <div class="white-bg mb2">
+ <div class="container">
+ <div class="row" data-summary-content>
+ <div class="col-sm-9 col-sm-push-3 col-lg-8 col-lg-push-2">
+ <ul>
+ <h2>{% trans "Blog Pages" %}</h2>
+ {% for blog_page in object.blog_pages.all %}
+ <li><a href="{% url 'organization-project-blogpage-detail' blog_page.slug %}">{{ blog_page.title }}</a></li>
+ {% endfor %}
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+{% endif %}
+{% endblock %}
+
+{% block logo %}
+ {% if object.organizations.all|length > 0 %}
+ <div class="page__block{% if block.background_color %} page__block--{{ block.background_color }}{% endif %}">
+ <div class="white-bg pb2">
+ <div class="container">
+ <div class="row" data-summary-content>
+ <div class="col-sm-9 col-sm-push-3 col-lg-8 col-lg-push-2">
+ <ul class="partners-list">
+ {% if object.lead_organization %}
+ {% with object.lead_organization.images.all|get_type:'logo' as images %}
+ {% include 'core/inc/logo.html' %}
+ {% endwith %}
+ {% endif %}
+ {% for organization in object.organizations.all %}
+ {% with organization.images.all|get_type:'logo' as images %}
+ {% include 'core/inc/logo.html' %}
+ {% endwith %}
+ {% endfor %}
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ {% endif %}
+{% endblock %}
+
+{% block page_related_content %}
+ {% with dynamic_content=object.dynamic_content_object.all|filter_content object=object %}
+ {% include "core/inc/related_content.html" %}
+ {% endwith %}
+{% endblock %}
--- /dev/null
+{% extends "vertigo_starts_eu/pages/page.html" %}
+{% load mezzanine_tags keyword_tags i18n organization_tags pages_tags %}
+
+{% block meta_title %}{% endblock %}
+
+{% block meta_keywords %}{% endblock %}
+
+{% block body_class %}
+ pattern pattern-bg {{ department.pages.all.0.weaving_css_class }}
+{% endblock %}
+
+{% block breadcrumb_menu %}
+ {{ block.super }}
+ <li class="breadcrumb__item active">{{ object.title }}</li>
+{% endblock %}
+
+{% block page_tags %}
+{% endblock %}
+
+{% block page_title %}
+ {% editable object.title %}
+ <h1 class="dotted">{% trans "New project form" %}</h1>
+ {% endeditable %}
+{% endblock %}
+
+{% block page_content %}
+ <div class="row">
+ {% errors_for form %}
+ <form class="mezzanine-form form" method="post"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
+ {% fields_for form %}
+ {% for formset in inlines %}
+ {{ formset.management_form }}
+ {% for form in formset %}
+ {% fields_for form %}
+ {% endfor %}
+ {% endfor %}
+ <div class="form-actions">
+ <input class="btn btn-primary btn-lg" type="submit"
+ value="{% if page.form.button_text %}{{ page.form.button_text }}{% else %}{% trans "Submit" %}{% endif %}">
+ </div>
+ </form>
+ </div>
+{% endblock %}
+
+{% block extra_js %}
+{{ block.super }}
+<script>
+$(function() {$('.mezzanine-form :input:visible:enabled:first').focus();});
+</script>
+{% endblock %}
<div class="row header__nav">
<div class="col-md-16 tal">
<div id="navHeader">
- {% page_menu "pages/menus/header.html" %}
+ {% page_menu "starts_eu/pages/menus/header.html" %}
</div>
</div>
</div>
{% with host_organization.images|get_type:"logo_header" as images %}
{% if images %}
{% with images|first as img %}
- <img src="{{ MEDIA_URL }}{{ img }}" title="{{ img.title }}" width="242" height="70" />
+ <img src="{{ MEDIA_URL }}{{ img }}" title="{{ img.title }}" />
{% endwith %}
{% endif %}
{% endwith %}
--- /dev/null
+{% extends "vertigo_starts_eu/pages/page.html" %}
+{% load mezzanine_tags keyword_tags i18n organization_tags pages_tags %}
+
+{% block meta_title %}{% endblock %}
+
+{% block meta_keywords %}{% endblock %}
+
+{% block body_class %}
+ pattern pattern-bg {{ department.pages.all.0.weaving_css_class }}
+{% endblock %}
+
+{% block breadcrumb_menu %}
+ {{ block.super }}
+ <li class="breadcrumb__item active">{{ object.title }}</li>
+{% endblock %}
+
+{% block page_tags %}
+{% endblock %}
+
+{% block page_title %}
+ {% editable object.title %}
+ <h1 class="dotted">{% trans "New project form" %}</h1>
+ {% endeditable %}
+{% endblock %}
+
+{% block page_content %}
+ <div class="row">
+ {% errors_for form %}
+ <form class="mezzanine-form form" method="post"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
+ {% fields_for form %}
+ {% for formset in inlines %}
+ {{ formset.management_form }}
+ {% for form in formset %}
+ {% fields_for form %}
+ {% endfor %}
+ {% endfor %}
+ <div class="form-actions">
+ <input class="btn btn-primary btn-lg" type="submit"
+ value="{% if page.form.button_text %}{{ page.form.button_text }}{% else %}{% trans "Submit" %}{% endif %}">
+ </div>
+ </form>
+ </div>
+{% endblock %}
+
+{% block extra_js %}
+{{ block.super }}
+<script>
+$(function() {$('.mezzanine-form :input:visible:enabled:first').focus();});
+</script>
+{% endblock %}
{% with host_organization.images|get_type:"logo_header" as images %}
{% if images %}
{% with images|first as img %}
- <img src="{{ MEDIA_URL }}{{ img }}" title="{{ img.title }}" width="242" height="70" />
+ <img src="{{ MEDIA_URL }}{{ img }}" title="{{ img.title }}" />
{% endwith %}
{% endif %}
{% endwith %}
DateTimeRange==0.2.8
workalendar==1.0.0
django-instagram==0.2.0a1
+django-extra-views==0.8.0
-Subproject commit 73490e436f57a0dc7a3bb9a9e3d535aa2b443ba9
+Subproject commit 595000c55f1205bced7a836d309be26303da1509