]> git.parisson.com Git - mezzo.git/commitdiff
Fix various form and inlines, modufy project submission workflow
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Tue, 14 Mar 2017 09:57:52 +0000 (10:57 +0100)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Tue, 14 Mar 2017 09:57:52 +0000 (10:57 +0100)
16 files changed:
app/organization/network/admin.py
app/organization/network/migrations/0091_auto_20170313_1425.py [new file with mode: 0644]
app/organization/network/models.py
app/organization/network/translation.py
app/organization/projects/admin.py
app/organization/projects/forms.py
app/organization/projects/migrations/0051_auto_20170314_0937.py [new file with mode: 0644]
app/organization/projects/models.py
app/organization/projects/translation.py
app/organization/projects/urls.py
app/organization/projects/views.py
app/themes/vertigo_starts_eu/templates/projects/project_ict_create.html
app/themes/vertigo_starts_eu/templates/projects/project_ict_submission.html [new file with mode: 0644]
app/themes/vertigo_starts_eu/templates/projects/project_ict_validation.html [new file with mode: 0644]
app/themes/vertigo_starts_eu/templates/projects/project_producer_create.html
etc/cron.d/app

index a21de84f0e614d76ddc520c03d6a81993c849b6b..4d1d88578f59d357b73f6e0578e5bfe9111515d1 100644 (file)
@@ -74,6 +74,11 @@ class OrganizationImageInline(TabularDynamicInlineAdmin):
     model = OrganizationImage
 
 
+class OrganizationUserImageInline(TabularDynamicInlineAdmin):
+
+    model = OrganizationUserImage
+
+
 class OrganizationBlockInline(StackedDynamicInlineAdmin):
 
     model = OrganizationBlock
@@ -95,7 +100,7 @@ class OrganizationAdmin(BaseTranslationOrderedModelAdmin):
                 OrganizationLinkedBlockInlineAdmin
                  ]
     list_display = ['name', 'type', 'admin_thumb']
-    list_filter = ['is_on_map',]
+    list_filter = ['is_on_map', 'type']
     search_fields = ['name',]
     first_fields = ['name',]
 
diff --git a/app/organization/network/migrations/0091_auto_20170313_1425.py b/app/organization/network/migrations/0091_auto_20170313_1425.py
new file mode 100644 (file)
index 0000000..387b6d9
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-03-13 13:25
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-network', '0090_auto_20170313_1224'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='organization',
+            name='role',
+        ),
+        migrations.AddField(
+            model_name='person',
+            name='role',
+            field=models.CharField(blank=True, max_length=256, null=True, verbose_name='role'),
+        ),
+    ]
index 7aee2c81955e0215f51daea29e6838024e5fdf71..94f5a57513ce64c345a2c0f20e4d9c6e40603c56 100644 (file)
@@ -112,11 +112,6 @@ BOX_SIZE_CHOICES = [
     (6, 6),
 ]
 
-ORGANIZATION_ROLE_CHOICES = [
-    ('coordinator', _('coordinator')),
-    ('producer', _('producer')),
-]
-
 
 class Organization(Named, Address, URL, AdminThumbRelatedMixin, Orderable):
     """(Organization description)"""
@@ -134,7 +129,6 @@ class Organization(Named, Address, URL, AdminThumbRelatedMixin, Orderable):
     bio = models.TextField(_('bio'), blank=True)
     site = models.ForeignKey("sites.Site", blank=True, null=True, on_delete=models.SET_NULL)
     admin_thumb_type = 'logo'
-    role = models.CharField(_('role'), max_length=128, blank=True, null=True, choices=ORGANIZATION_ROLE_CHOICES)
 
     class Meta:
         verbose_name = _('organization')
@@ -170,10 +164,6 @@ class Organization(Named, Address, URL, AdminThumbRelatedMixin, Orderable):
             self.lat = lat
             self.lon = lon
 
-    def save(self, **kwargs):
-        self.clean()
-        super(Organization, self).save()
-
 
 class Team(Named, URL):
     """(Team description)"""
@@ -223,6 +213,7 @@ class Person(Displayable, AdminThumbMixin, Address):
     register_id = models.CharField(_('register ID'), blank=True, null=True, max_length=128)
     birthday = models.DateField(_('birthday'), blank=True, null=True)
     bio = RichTextField(_('biography'), blank=True)
+    role = models.CharField(_('role'), max_length=256, blank=True, null=True)
     external_id = models.CharField(_('external ID'), blank=True, null=True, max_length=128)
 
     class Meta:
index 94a1d6dc4bdba4ffa100d9b91709708280562d81..7eb571d9085367a8add2c0a2c6024f958c63346e 100644 (file)
@@ -132,6 +132,12 @@ class OrganizationServiceTranslationOptions(TranslationOptions):
     fields = ('name', 'description')
 
 
+@register(OrganizationContact)
+class OrganizationContactTranslationOptions(TranslationOptions):
+
+    pass
+
+
 @register(PersonListBlock)
 class PersonListBlockTranslationOptions(TranslationOptions):
 
index 5316a2b1d8ff6aec08b25a584e98d4b8c92baa64..d8c3dd277a1dd595e0a696e215c88783b7923e72 100644 (file)
@@ -96,9 +96,14 @@ class ProjectAdmin(admin.ModelAdmin):
     model = Project
 
 
-class ProjectICTDataInline(StackedDynamicInlineAdmin):
+class ProjectPublicDataInline(StackedDynamicInlineAdmin):
 
-    model = ProjectICTData
+    model = ProjectPublicData
+
+
+class ProjectPrivateDataInline(StackedDynamicInlineAdmin):
+
+    model = ProjectPrivateData
 
 
 class ProjectRelatedTitleAdmin(TranslationTabularInline):
@@ -124,7 +129,8 @@ class ProjectAdminDisplayable(DisplayableAdmin):
                 ProjectContactInline,
                 ProjectUserImageInline,
                 ProjectImageInline,
-                ProjectICTDataInline,
+                ProjectPublicDataInline,
+                ProjectPrivateDataInline,
                 ProjectWorkPackageInline,
                 ProjectPlaylistInline,
                 ProjectLinkInline,
index ed8149922ab79892c26b7e6b82abee582661a3f4..db9713eb9b449d117a085f0dc11f8f71f6a8d0b2 100644 (file)
@@ -55,24 +55,39 @@ class DynamicContentProjectForm(autocomplete.FutureModelForm):
 
 class ProjectForm(ModelForm):
 
+    def __init__(self, *args, **kwargs):
+        super(ProjectForm, self).__init__(*args, **kwargs)
+        self.fields['title'].label = "Name"
+        self.fields['keywords'].help_text = "5 comma separated keywords"
+
     class Meta:
         model = Project
-        fields = ('title', 'description', 'keywords', 'website')
+        fields = ('title', 'keywords', 'website')
+
 
 
-class ProjectICTDataInline(InlineFormSet):
+class ProjectPublicDataInline(InlineFormSet):
 
     max_num = 1
-    model = ProjectICTData
-    prefix = 'ICT data'
+    model = ProjectPublicData
+    prefix = "Public data"
+    can_delete = False
+    fields = '__all__'
+
+
+class ProjectPrivateDataInline(InlineFormSet):
+
+    model = ProjectPrivateData
+    prefix = "Private data"
     can_delete = False
     fields = '__all__'
 
+
 class ProjectUserImageInline(InlineFormSet):
 
-    max_num = 4
+    extra = 3
     model = ProjectUserImage
-    prefix = 'Images'
+    prefix = 'Private images'
     can_delete = False
     fields = ['file', 'credits']
 
@@ -81,17 +96,36 @@ class ProjectContactInline(InlineFormSet):
 
     max_num = 1
     model = ProjectContact
-    prefix = 'Contact'
+    prefix = 'Private project contact'
     can_delete = False
     fields = ['first_name', 'last_name', 'address', 'email',
                  'telephone', 'address', 'postal_code', 'city', 'country']
 
 
-class ProducerForm(ModelForm):
+class OrganizationContactInline(InlineFormSet):
+
+    max_num = 1
+    model = OrganizationContact
+    prefix = 'Contact'
+    can_delete = False
+    fields = ['person_title', 'first_name', 'last_name', 'email', 'telephone', 'role']
+
+
+class OrganizationUserImageInline(InlineFormSet):
+
+    max_num = 4
+    model = OrganizationUserImage
+    prefix = 'Images'
+    can_delete = False
+    fields = ['file', 'credits']
+
+
+class OrganizationForm(ModelForm):
 
     class Meta:
         model = Organization
-        fields = '__all__'
+        fields = ['name', 'description', 'url', 'address',
+                  'address', 'postal_code', 'city', 'country',]
 
 
 class ProjectResidencyForm(ModelForm):
diff --git a/app/organization/projects/migrations/0051_auto_20170314_0937.py b/app/organization/projects/migrations/0051_auto_20170314_0937.py
new file mode 100644 (file)
index 0000000..2008aa3
--- /dev/null
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-03-14 08:37
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-projects', '0050_auto_20170313_1224'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ProjectPrivateData',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('description', models.TextField(help_text='(500 - 1000 words)', verbose_name='project description')),
+                ('affiliation', models.CharField(max_length=512, verbose_name='affiliation')),
+                ('commitment_letter', models.FileField(help_text='Written on behalf of the whole project consortium, this letter will commit in implementing the collaboration of a residency application selected by the VERTIGO jury, on the conditions set by the project (in annex of letter: synthesis of all related information entered by project).', max_length=1024, upload_to='Documents/%Y/%m/%d/', verbose_name='letter of commitment by the project coordinator')),
+                ('persons', models.CharField(help_text='First name and last name of the persons from organization / project who will be part preliminary of the project team (separated by a comma)', max_length=512, verbose_name='persons')),
+            ],
+            options={
+                'verbose_name': 'Project private data',
+                'verbose_name_plural': 'Project private data',
+            },
+        ),
+        migrations.CreateModel(
+            name='ProjectPublicData',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('brief_description', models.CharField(help_text='Brief description of the challenges faced by the project to be used for wider communication strategy (e.g. Twitter) (110 characters max).', max_length=110, verbose_name='brief description')),
+                ('challenges_description', models.TextField(help_text='Full description of the challenges faced by the project (100-150 words).', verbose_name='full description')),
+                ('technology_description', models.TextField(help_text='Must include the elements to be made available to the artist with sufficient functional and implementation details for enabling him/her to elaborate his/her technical approach (100-200 words).', verbose_name='technology 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='objective description')),
+                ('resources_description', models.TextField(help_text='Resources available to the artist -- 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 equipment, etc... (50 – 100 words).', verbose_name='resource description')),
+                ('period', models.CharField(help_text='Possible period of implementation (must be part of the project implementation workplan)', max_length=128, verbose_name='period of implementation')),
+                ('image', models.FileField(help_text='Representing the project', max_length=1024, upload_to='images', verbose_name='Image')),
+                ('image_credits', models.CharField(blank=True, max_length=256, null=True, verbose_name='Image credits')),
+            ],
+            options={
+                'verbose_name': 'Project public data',
+                'verbose_name_plural': 'Project public data',
+            },
+        ),
+        migrations.RemoveField(
+            model_name='projectictdata',
+            name='project',
+        ),
+        migrations.AlterField(
+            model_name='project',
+            name='type',
+            field=models.CharField(choices=[('internal', 'internal'), ('external', 'external')], max_length=128, verbose_name='type'),
+        ),
+        migrations.DeleteModel(
+            name='ProjectICTData',
+        ),
+        migrations.AddField(
+            model_name='projectpublicdata',
+            name='project',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='public_data', to='organization-projects.Project', verbose_name='project'),
+        ),
+        migrations.AddField(
+            model_name='projectprivatedata',
+            name='project',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='private_data', to='organization-projects.Project', verbose_name='project'),
+        ),
+    ]
index 80c8a7b47b0425e1ec4a0f72c0770edb9e6c7cbb..3d5d14980e46b98f0f8227373484db117d67454c 100644 (file)
@@ -37,7 +37,6 @@ from organization.network.models import *
 PROJECT_TYPE_CHOICES = [
     ('internal', _('internal')),
     ('external', _('external')),
-    ('ICT', _('ICT')),
 ]
 
 REPOSITORY_ACCESS_CHOICES = [
@@ -332,24 +331,36 @@ class ProjectBlogPage(Displayable, RichText):
         return reverse("organization-project-blogpage-detail", kwargs={"slug": self.slug})
 
 
-class ProjectICTData(models.Model):
+class ProjectPublicData(models.Model):
 
-    project = models.ForeignKey(Project, verbose_name=_('project'), related_name='ict_data', blank=True, null=True, on_delete=models.SET_NULL)
+    project = models.ForeignKey(Project, verbose_name=_('project'), related_name='public_data', blank=True, null=True, on_delete=models.SET_NULL)
+
+    brief_description = models.CharField(_('brief description'), max_length=110, help_text="Brief description of the challenges faced by the project to be used for wider communication strategy (e.g. Twitter) (110 characters max).")
+    challenges_description = models.TextField(_('full description'), help_text="Full description of the challenges faced by the project (100-150 words).")
+    technology_description = models.TextField(_('technology description'), help_text="Must include the elements to be made available to the artist with sufficient functional and implementation details for enabling him/her to elaborate his/her technical approach (100-200 words).")
+    objectives_description = models.TextField(_('objective 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(_('resource description'), help_text="Resources available to the artist -- 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 equipment, etc... (50 – 100 words).")
+    period = models.CharField(_('period of implementation'), max_length=128, help_text="Possible period of implementation (must be part of the project implementation workplan)")
+    image = models.FileField(_("Image"), max_length=1024, upload_to="images", help_text="Representing the project")
+    image_credits = models.CharField(_('Image credits'), max_length=256, blank=True, null=True)
+
+    class Meta:
+        verbose_name = 'Project public data'
+        verbose_name_plural = 'Project public data'
 
-    # Public
-    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
-    letter = models.TextField(_('letter of commitment'))
+class ProjectPrivateData(models.Model):
+
+    project = models.ForeignKey(Project, verbose_name=_('project'), related_name='private_data', blank=True, null=True, on_delete=models.SET_NULL)
+
+    description = models.TextField(_('project description'), help_text="(500 - 1000 words)")
+    affiliation = models.CharField(_('affiliation'), max_length=512)
+    commitment_letter = models.FileField(_("letter of commitment by the project coordinator"), max_length=1024, upload_to="Documents/%Y/%m/%d/", help_text="Written on behalf of the whole project consortium, this letter will commit in implementing the collaboration of a residency application selected by the VERTIGO jury, on the conditions set by the project (in annex of letter: synthesis of all related information entered by project).")
+    persons = models.CharField(_('persons'), max_length=512, help_text="First name and last name of the persons from organization / project who will be part preliminary of the project team (separated by a comma)")
 
     class Meta:
-        verbose_name = 'Project ICT data'
-        verbose_name_plural = 'Project ICT data'
+        verbose_name = 'Project private data'
+        verbose_name_plural = 'Project private data'
 
 
 class ProjectContact(Person):
index d263f3f77033358dbcdf5fd43cccf26b65da08ab..6adaccd0921aec63573b00d15406cdf201728c24 100644 (file)
@@ -120,8 +120,14 @@ class DynamicContentProjectTranslationOptions(TranslationOptions):
     fields = ()
 
 
-@register(ProjectICTData)
-class ProjectICTDataTranslationOptions(TranslationOptions):
+@register(ProjectPublicData)
+class ProjectPublicDataTranslationOptions(TranslationOptions):
+
+    pass
+
+
+@register(ProjectPrivateData)
+class ProjectPrivateDataTranslationOptions(TranslationOptions):
 
     pass
 
index e0eb243915df852ba4625e1eadc5877e7ad3bf5f..2792c3bb37b4f4c5662bf7a6b83fe125b9085618 100644 (file)
@@ -40,13 +40,17 @@ urlpatterns = [
     url("^calls/list/$", ProjectCallListView.as_view(), name='organization-call-list'),
     url("^calls/(?P<slug>.*)/detail/$", ProjectCallDetailView.as_view(), name='organization-call-detail'),
 
-    url("^calls/(?P<slug>.*)/projects/submission/$", ProjectICTCreateView.as_view(), name='organization-project-create'),
+    # url("^calls/(?P<slug>.*[^\/])/projects/submission/$", ProjectICTSubmissionView.as_view(), name='organization-project-submission'),
+    url("^calls/(?P<slug>.*)/detail/projects/submission/$", ProjectICTSubmissionView.as_view(), name='organization-project-submission'),
+    url("^calls/(?P<slug>.*)/detail/projects/create/$", ProjectICTCreateView.as_view(), name='organization-project-create'),
+    url("^calls/(?P<slug>.*)/detail/projects/validation/$", ProjectICTSubmissionView.as_view(), name='organization-project-validation'),
+
     url("^calls/(?P<call_slug>.*)/projects/detail/(?P<slug>.*)/$", ProjectICTDetailView.as_view(), name='organization-project-detail'),
     url("^calls/(?P<call_slug>.*)/projects/list/$", ProjectICTListView.as_view(), name='organization-project-list'),
 
-    url("^calls/(?P<slug>.*)/producers/submission/$", ProducerCreateView.as_view(), name='organization-producer-create'),
-    url("^calls/(?P<call_slug>.*)/producers/(?P<slug>.*)/detail/$", ProducerDetailView.as_view(), name='organization-producer-detail'),
-    url("^calls/(?P<call_slug>.*)/producers/list/$", ProducerListView.as_view(), name='organization-producer-list'),
+    url("^producers/submission/$", ProducerCreateView.as_view(), name='organization-producer-create'),
+    url("^producers/(?P<slug>.*)/detail/$", ProducerDetailView.as_view(), name='organization-producer-detail'),
+    url("^producers/list/$", ProducerListView.as_view(), name='organization-producer-list'),
 
     url("^calls/(?P<slug>.*)/residencies/submission/$", ProjectResidencyCreateView.as_view(), name='organization-residency-create'),
     url("^calls/(?P<call_slug>.*)/residencies/(?P<slug>.*)/detail/$", ProjectResidencyDetailView.as_view(), name='organization-residency-detail'),
index ca2c49e1d043f6817f002faec7921edad78562b6..7793bfd5249a7e14b9a244e74f209ffff34df8e1 100644 (file)
@@ -27,6 +27,7 @@ from mezzanine_agenda.models import Event
 from mezzanine.conf import settings
 from organization.projects.models import *
 from organization.projects.forms import *
+from organization.network.forms import *
 from organization.core.views import *
 from organization.magazine.views import Article
 from organization.pages.models import CustomPage
@@ -127,17 +128,47 @@ class ProjectICTDetailView(SlugMixin,DetailView):
     template_name='projects/project_ict_detail.html'
 
 
-class ProjectICTCreateView(CreateWithInlinesView):
+class ProjectCallMixin(object):
+
+    def get_context_data(self, **kwargs):
+        context = super(ProjectCallMixin, self).get_context_data(**kwargs)
+        self.call = ProjectCall.objects.get(slug=self.kwargs['slug'])
+        context['call'] = self.call
+        return context
+
+
+class ProjectICTSubmissionView(ProjectCallMixin, TemplateView):
+
+    model = Project
+    template_name='projects/project_ict_submission.html'
+
+
+
+class ProjectICTCreateView(ProjectCallMixin, CreateWithInlinesView):
 
     model = Project
     form_class = ProjectForm
     template_name='projects/project_ict_create.html'
-    inlines = [ProjectICTDataInline, ProjectUserImageInline, ProjectContactInline,]
+    inlines = [ProjectPublicDataInline, ProjectPrivateDataInline, ProjectUserImageInline, ProjectContactInline,]
+    topic = 'ICT'
+
+
+    def forms_valid(self, form, inlines):
+        self.object = form.save()
+        self.object.call = self.call
+        self.object.topic, c = ProjectTopic.objects.get_or_create(name='ICT')
+        self.object.save()
+        return super(ProjectICTCreateView, self).forms_valid(form, inlines)
+
+    def get_success_url(self):
+        return reverse_lazy('organization-project-validation', kwargs={'slug':self.call.slug})
+
+
+class ProjectICTValidationView(ProjectCallMixin, TemplateView):
+
+    model = Project
+    template_name='projects/project_ict_validation.html'
 
-    def get_context_data(self, **kwargs):
-        context = super(ProjectICTCreateView, self).get_context_data(**kwargs)
-        context['call'] = get_object_or_404(ProjectCall, slug=self.kwargs['slug'])
-        return context
 
 class ProjectICTListView(ListView):
 
@@ -169,22 +200,26 @@ class ProducerListView(ListView):
     template_name='projects/project_producer_list.html'
 
     def get_queryset(self):
-        qs = Organization.objects.filter(role='producer')
+        type, c = OrganizationType.objects.get_or_create(name='Producer')
+        qs = Organization.objects.filter(type=type)
         return qs
 
 
 class ProducerCreateView(CreateWithInlinesView):
 
     model = Organization
-    form_class = ProducerForm
+    form_class = OrganizationForm
     template_name='projects/project_producer_create.html'
-    # inlines = [OrganizationICTDataInline, OrganizationUserImageInline, OrganizationContactInline,]
+    inlines = [OrganizationContactInline, OrganizationUserImageInline]
 
     def forms_valid(self, form, inlines):
         self.object = form.save()
-        self.object.role = 'producer'
+        self.object.type, c = OrganizationType.objects.get_or_create(name='Producer')
         self.object.save()
-        return super(ProducerCreateView, self).form_valid(form)
+        return super(ProducerCreateView, self).forms_valid(form, inlines)
+
+    def get_success_url(self):
+        return reverse_lazy('organization-producer-detail', kwargs={'slug':self.slug})
 
 
 class ProjectResidencyDetailView(SlugMixin, DetailView):
index c6b0e68882ec83cafef424ae03a1799a64fc5282..9f5d8f70d303723f342de31a5e741fb6cc76a47a 100644 (file)
 
 {% block page_title %}
     {% editable object.title %}
-        <h1 class="dotted">{% trans "Framework and submission process for hosting R&D Projects" %}</h1>
+        <h1 class="dotted">{% trans "Project submission form" %}</h1>
     {% endeditable %}
+        <h3>All fields are required</h3>
 {% endblock %}
 
 {% block page_content %}
-
-    <div class="row">
-        {% if call.project_form_content %}
-            {% editable call.project_form_content %}
-                {{ call.project_form_content|richtext_filters|safe }}
-            {% endeditable %}
-        {% endif %}
-    </div>
-
     <div class="row">
-        <h2 class="dotted">{% trans "Project submission form (all fields required)" %}</h2>
         {% errors_for form %}
         <form class="mezzanine-form form" method="post"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
             {% fields_for form %}
diff --git a/app/themes/vertigo_starts_eu/templates/projects/project_ict_submission.html b/app/themes/vertigo_starts_eu/templates/projects/project_ict_submission.html
new file mode 100644 (file)
index 0000000..ac6cc13
--- /dev/null
@@ -0,0 +1,46 @@
+{% 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 "Framework and submission process for hosting R&D Projects" %}</h1>
+    {% endeditable %}
+{% endblock %}
+
+{% block page_content %}
+
+    <div class="row">
+        {% if call.project_form_content %}
+            {% editable call.project_form_content %}
+                {{ call.project_form_content|richtext_filters|safe }}
+            {% endeditable %}
+        {% endif %}
+    </div>
+
+    <div class="row">
+        <a class="button button--block" href="{% url 'organization-project-create' call.slug %}" class="sidebar__entry">{% trans "Access to submission form" %}</a>
+    </div>
+{% endblock %}
+
+{% block extra_js %}
+{{ block.super }}
+<script>
+$(function() {$('.mezzanine-form :input:visible:enabled:first').focus();});
+</script>
+{% endblock %}
diff --git a/app/themes/vertigo_starts_eu/templates/projects/project_ict_validation.html b/app/themes/vertigo_starts_eu/templates/projects/project_ict_validation.html
new file mode 100644 (file)
index 0000000..8525db9
--- /dev/null
@@ -0,0 +1,40 @@
+{% 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 "Project submission validation" %}</h1>
+    {% endeditable %}
+        <h3>All fields are required</h3>
+{% endblock %}
+
+{% block page_content %}
+    <div class="row">
+        {% editable call.project_form_content %}
+            {{ call.project_validation_content|richtext_filters|safe }}
+        {% endeditable %}
+    </div>
+{% endblock %}
+
+{% block extra_js %}
+{{ block.super }}
+<script>
+$(function() {$('.mezzanine-form :input:visible:enabled:first').focus();});
+</script>
+{% endblock %}
index 4c10cf08f03f53113d6a88c321a4f61a211f25b3..f1fb36fe0b660f71bc798b75b20aef66b0c11ac7 100644 (file)
 
 {% block page_title %}
     {% editable object.title %}
-        <h1 class="dotted">{% trans "New producer form" %}</h1>
+        <h1 class="dotted">{% trans "Framework and submission process for producers" %}</h1>
     {% endeditable %}
 {% endblock %}
 
 {% block page_content %}
     <div class="row">
+        {% if call.project_form_content %}
+            {% editable call.project_form_content %}
+                {{ call.project_form_content|richtext_filters|safe }}
+            {% endeditable %}
+        {% endif %}
+    </div>
+
+    <div class="row">
+        <h2 class="dotted">{% trans "Producer submission form (all fields required)" %}</h2>
         {% 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 }}
+                <hr>
+                <h2>{{ formset.prefix }}</h2>
                 {% for form in formset %}
                    {% fields_for form %}
                 {% endfor %}
index 1e518e405e78984c549b9964337e1dbf9c502935..9fe8fe66fceaf84515c2c3744647013a597ffeda 100644 (file)
@@ -1,6 +1,6 @@
 APP=/srv/vertigo
 PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
 
-0     */6  * * * cri cd $APP; bin/push.sh >> var/log/cron/push.log
-*/10  *    * * * cri cd $APP; bin/poll_twitter.sh >> var/log/cron/pull_twitter.log
+0     */3  * * * cri cd $APP; bin/push.sh >> var/log/cron/push.log
+*/10  *    * * * cri cd $APP; bin/poll_twitter.sh >> var/log/cron/poll_twitter.log
 #0,30 *    * * * cri cd $APP; bin/upgrade.sh >> var/log/cron/upgrade.log