update year
[prawokultury.git] / prawokultury / contact_forms.py
index 4d6b70a..bf6949a 100644 (file)
@@ -3,15 +3,17 @@ from __future__ import unicode_literals
 
 from django.conf import settings
 from django import forms
 
 from django.conf import settings
 from django import forms
+from django.core.mail import send_mail
+
 from contact.forms import ContactForm
 from contact.models import Contact
 from contact.fields import HeaderField
 from django.utils.functional import lazy
 from contact.forms import ContactForm
 from contact.models import Contact
 from contact.fields import HeaderField
 from django.utils.functional import lazy
-from django.utils.translation import ugettext_noop as _
+from django.utils.translation import ugettext_lazy as _
 from django.utils.safestring import mark_safe
 from migdal.models import Entry
 
 from django.utils.safestring import mark_safe
 from migdal.models import Entry
 
-from prawokultury.countries import COUNTRIES
+from prawokultury.countries import COUNTRIES, TRAVEL_GRANT_COUNTRIES
 
 mark_safe_lazy = lazy(mark_safe, unicode)
 
 
 mark_safe_lazy = lazy(mark_safe, unicode)
 
@@ -19,18 +21,31 @@ mark_safe_lazy = lazy(mark_safe, unicode)
 class RegistrationForm(ContactForm):
     form_tag = 'register'
 
 class RegistrationForm(ContactForm):
     form_tag = 'register'
 
-    save_as_tag = '2017'
-    conference_name = u'CopyCamp 2017'
+    save_as_tag = '2018'
+    conference_name = u'CopyCamp 2018'
+    notify_on_register = False
     
     form_title = _('Registration')
     admin_list = ['first_name', 'last_name', 'organization']
 
     
     form_title = _('Registration')
     admin_list = ['first_name', 'last_name', 'organization']
 
+    mailing_field = 'agree_mailing'
+
+    travel_grant_countries = TRAVEL_GRANT_COUNTRIES
+
     first_name = forms.CharField(label=_('First name'), max_length=128)
     last_name = forms.CharField(label=_('Last name'), max_length=128)
     contact = forms.EmailField(label=_('E-mail'), max_length=128)
     first_name = forms.CharField(label=_('First name'), max_length=128)
     last_name = forms.CharField(label=_('Last name'), max_length=128)
     contact = forms.EmailField(label=_('E-mail'), max_length=128)
-    organization = forms.CharField(label=_('Organization'), 
-            max_length=256, required=False)
-    country = forms.ChoiceField(label=_('Country'), choices=zip(COUNTRIES, COUNTRIES))
+    organization = forms.CharField(label=_('Organization'), max_length=256, required=False)
+    country = forms.ChoiceField(label=_('Country of residence'), choices=zip(COUNTRIES, COUNTRIES))
+    travel_grant = forms.BooleanField(
+        label=_('I require financial assistance to attend CopyCamp 2018.'), required=False)
+    travel_grant_motivation = forms.CharField(
+        label=_('Please write us about yourself and why you want to come to CopyCamp. '
+                'This information will help us evaluate your travel grant application:'),
+        help_text=_('Financial assistance for German audience is possible '
+                    'thanks to the funds of the German Federal Foreign Office transferred by '
+                    'the Foundation for Polish-German Cooperation.'),
+        widget=forms.Textarea, max_length=600, required=False)
 
     days = forms.ChoiceField(
        label=_("I'm planning to show up on"),
 
     days = forms.ChoiceField(
        label=_("I'm planning to show up on"),
@@ -111,16 +126,23 @@ class RegistrationForm(ContactForm):
     motivation_other = forms.CharField(required=False, label=_('Fill if you selected “other” above'))
 
     agree_mailing = forms.BooleanField(
     motivation_other = forms.CharField(required=False, label=_('Fill if you selected “other” above'))
 
     agree_mailing = forms.BooleanField(
-        label=_('I am interested in receiving information about the Modern Poland Foundation\'s activities by e-mail'),
+        label=_('I want to receive e-mails about future CopyCamps '
+                'and similar activities of the Modern Poland Foundation'),
         required=False
     )
     agree_data = forms.BooleanField(
         label=_('Permission for data processing'),
         required=False
     )
     agree_data = forms.BooleanField(
         label=_('Permission for data processing'),
-        help_text=_(u'I hereby grant Modern Poland Foundation (Fundacja Nowoczesna Polska, ul. Marszałkowska 84/92, 00-514 Warszawa) permission to process my personal data (name, e-mail address) for purposes of registration for CopyCamp conference.')
+        help_text=_(
+            u'I hereby grant Modern Poland Foundation (Fundacja Nowoczesna Polska, ul. Marszałkowska 84/92, '
+            u'00-514 Warszawa) permission to process my personal data (name, e-mail address) for purposes '
+            u'of registration for CopyCamp conference.')
     )
     agree_license = forms.BooleanField(
         label=_('Permission for publication'),
     )
     agree_license = forms.BooleanField(
         label=_('Permission for publication'),
-        help_text=mark_safe_lazy(_(u'I agree to having materials, recorded during the conference, released under the terms of <a href="http://creativecommons.org/licenses/by-sa/3.0/deed">CC\u00a0BY-SA</a> license and to publishing my image.')),
+        help_text=mark_safe_lazy(_(
+            u'I agree to having materials, recorded during the conference, released under the terms of '
+            u'<a href="http://creativecommons.org/licenses/by-sa/3.0/deed">CC\u00a0BY-SA</a> license and '
+            u'to publishing my image.')),
         required=False
     )
 
         required=False
     )
 
@@ -143,8 +165,25 @@ class RegistrationForm(ContactForm):
             raise forms.ValidationError(_('Select at most 3 areas'))
         return data
 
             raise forms.ValidationError(_('Select at most 3 areas'))
         return data
 
+    def clean(self):
+        cleaned_data = self.cleaned_data
+        if 'travel_grant' in cleaned_data:
+            country = cleaned_data['country']
+            travel_grant = cleaned_data['travel_grant']
+            motivation = cleaned_data['travel_grant_motivation']
+            if country not in self.travel_grant_countries and travel_grant:
+                raise forms.ValidationError(_('Travel grant is not provided for the selected country'))
+            if travel_grant and not motivation:
+                self._errors['travel_grant_motivation'] = _('Please provide this information')
+                raise forms.ValidationError(_('To apply for a travel grant you must provide additional information.'))
+            if not travel_grant and motivation:
+                cleaned_data['motivation'] = ''
+        return cleaned_data
+
     def main_fields(self):
     def main_fields(self):
-        return [self[name] for name in ('first_name', 'last_name', 'contact', 'organization', 'country', 'days')]
+        return [self[name] for name in (
+            'first_name', 'last_name', 'contact', 'organization', 'country',
+            'travel_grant', 'travel_grant_motivation', 'days')]
 
     def survey_fields(self):
         return [self[name] for name in (
 
     def survey_fields(self):
         return [self[name] for name in (
@@ -156,65 +195,42 @@ class RegistrationForm(ContactForm):
 
 
 tracks = (
 
 
 tracks = (
-    (_('business models, heritage digitization, remix'),
-     _('What are the boundaries of appropriation in culture? '
-       'Who owns the past and whether these exclusive rights allow to '
-       'control present and future? How to make money from creativity without selling yourself?')),
-    (_('health, food, security, and exclusive rights'),
-     _('Who owns medicines and equipment necessary to provide health care? '
-       'Who owns grain and machines used to harvest it? '
-       'To what extent exclusive rights can affect what you eat, '
-       'how you exercise, whether you can apply a specific treatment?')),
-    (_('text and data mining, machine learning, online education'),
-     _('Do you think own the data you feed to algorithms? Or maybe you think you own these algorithms? '
-       'What if you can’t mine the data because you actually don’t own any of those rights? '
-       'What does it mean to own data about someone, or data necessary for that person’s education?')),
-    (_('IoT: autonomous cars, smart homes, wearables'),
-     _('What does it mean to own exclusive rights to software and data used to construct autonomous agents? '
-       'What will it mean in a near future?')),
-    (_('hacking government data, public procurement, public aid in culture'),
-     _('Who owns information created using public money? How can this information be appropriated? '
-       'What is the role of government in the development of information infrastructure?')),
+    _('social security in the creative sector'),
+    _('100 years of the evolution of modern copyright law and industrial property law in Poland '
+      'and of cultural activities regulated by this law'),
+    _('EU copyright reform'),
+    _('blockchain use prospects'),
+    _('reuse of archives and cultural heritage'),
 )
 
 
 class RegisterSpeaker(RegistrationForm):
     form_tag = 'register-speaker'
 )
 
 
 class RegisterSpeaker(RegistrationForm):
     form_tag = 'register-speaker'
-    save_as_tag = '2017-speaker'
+    save_as_tag = '2018-speaker'
     form_title = _('Open call for presentations')
     notify_on_register = False
     form_title = _('Open call for presentations')
     notify_on_register = False
-
-    # inherited fields included so they are not translated
-    first_name = forms.CharField(label=_('First name'), max_length=128)
-    last_name = forms.CharField(label=_('Last name'), max_length=128)
-    organization = forms.CharField(label=_('Organization'),
-            max_length=256, required=False)
-    agree_mailing = forms.BooleanField(
-        label=_('I am interested in receiving information about the Modern Poland Foundation\'s activities by e-mail'),
-        required=False
-    )
-    agree_license = forms.BooleanField(
-        label=_('Permission for publication'),
-        help_text=mark_safe_lazy(_(u'I agree to having materials, recorded during the conference, released under the terms of <a href="http://creativecommons.org/licenses/by-sa/3.0/deed">CC\u00a0BY-SA</a> license and to publishing my image.')),
-        required=False
-    )
+    mailing_field = 'agree_mailing'
 
     presentation_thematic_track = forms.ChoiceField(
 
     presentation_thematic_track = forms.ChoiceField(
-        label=_('Please select one thematic track'),
-        choices=[(t, mark_safe('<strong>%s</strong><p style="margin-left: 20px;">%s</p>' % (t, desc))) for t, desc in tracks],
-        widget=forms.RadioSelect())
-
-    bio = forms.CharField(label=_('Short biographical note in English (max. 500 characters)'), widget=forms.Textarea,
-                          max_length=500, required=False)
+        label=_('Thematic track'),
+        choices=[(t, t) for t in tracks], widget=forms.RadioSelect())
+
+    bio = forms.CharField(label=mark_safe_lazy(
+        _('Short biographical note in Polish (max. 500 characters, not required)')),
+                          widget=forms.Textarea, max_length=500, required=False)
+    bio_en = forms.CharField(label=_('Short biographical note in English (max. 500 characters)'), widget=forms.Textarea,
+                             max_length=500)
     photo = forms.FileField(label=_('Photo'), required=False)
     phone = forms.CharField(label=_('Phone number'), max_length=64,
                             required=False,
     photo = forms.FileField(label=_('Photo'), required=False)
     phone = forms.CharField(label=_('Phone number'), max_length=64,
                             required=False,
-                            help_text=_('Used only for organizational purposes.'))
+                            help_text=_('(used only for organizational purposes)'))
 
     presentation_title = forms.CharField(
 
     presentation_title = forms.CharField(
-        label=mark_safe_lazy(_('Title of the presentation in English')),
+        label=mark_safe_lazy(_('Presentation title in Polish (not required)')),
         max_length=256, required=False)
         max_length=256, required=False)
-    presentation_summary = forms.CharField(label=_('Summary of presentation (max. 1800 characters)'),
+    presentation_title_en = forms.CharField(
+        label=_('Presentation title in English'), max_length=256)
+    presentation_summary = forms.CharField(label=_('Presentation summary (max. 1800 characters)'),
                                            widget=forms.Textarea, max_length=1800)
 
     # presentation_post_conference_publication = forms.BooleanField(
                                            widget=forms.Textarea, max_length=1800)
 
     # presentation_post_conference_publication = forms.BooleanField(
@@ -225,16 +241,10 @@ class RegisterSpeaker(RegistrationForm):
     agree_data = None
 
     agree_terms = forms.BooleanField(
     agree_data = None
 
     agree_terms = forms.BooleanField(
-        label=mark_safe_lazy(_(u'I accept <a href="/en/info/terms-and-conditions/">'
-                               u'CopyCamp Terms and Conditions</a>.'))
+        label=mark_safe_lazy(
+            _(u'I accept <a href="/en/info/terms-and-conditions/">CopyCamp Terms and Conditions</a>.'))
     )
 
     )
 
-    # workshop = forms.BooleanField(label=_('Workshop'), required=False)
-    # workshop_title = forms.CharField(label=_('Title of workshop'),
-    #        max_length=256, required=False)
-    # workshop_summary = forms.CharField(label=_('Summary of workshop (max. 1800 characters)'),
-    #        widget=forms.Textarea, max_length=1800, required=False)
-
     def __init__(self, *args, **kw):
         super(RegisterSpeaker, self).__init__(*args, **kw)
         self.started = getattr(settings, 'REGISTRATION_SPEAKER_STARTED', False)
     def __init__(self, *args, **kw):
         super(RegisterSpeaker, self).__init__(*args, **kw)
         self.started = getattr(settings, 'REGISTRATION_SPEAKER_STARTED', False)
@@ -246,14 +256,13 @@ class RegisterSpeaker(RegistrationForm):
             'phone',
             'organization',
             'bio',
             'phone',
             'organization',
             'bio',
+            'bio_en',
             'photo',
             'presentation_title',
             'photo',
             'presentation_title',
+            'presentation_title_en',
             'presentation_summary',
             'presentation_thematic_track',
             # 'presentation_post_conference_publication',
             'presentation_summary',
             'presentation_thematic_track',
             # 'presentation_post_conference_publication',
-            # 'workshop',
-            # 'workshop_title',
-            # 'workshop_summary',
 
             'agree_mailing',
             # 'agree_data',
 
             'agree_mailing',
             # 'agree_data',
@@ -264,8 +273,8 @@ class RegisterSpeaker(RegistrationForm):
 
 class RemindForm(ContactForm):
     form_tag = 'remind-me'
 
 class RemindForm(ContactForm):
     form_tag = 'remind-me'
-    save_as_tag = 'remind-me-2017'
-    form_title = u'CopyCamp 2017'
+    save_as_tag = 'remind-me-2018'
+    form_title = u'CopyCamp 2018'
     notify_on_register = False
     notify_user = False
 
     notify_on_register = False
     notify_user = False
 
@@ -280,62 +289,82 @@ class NextForm(ContactForm):
                                    max_length=256, required=False)
 
 
                                    max_length=256, required=False)
 
 
+def workshop_field(label):
+    return forms.BooleanField(label=_(label), required=False)
+
+
 class WorkshopForm(ContactForm):
     form_tag = 'workshops'
 class WorkshopForm(ContactForm):
     form_tag = 'workshops'
-    save_as_tag = 'workshops-2017'
-    conference_name = u'CopyCamp 2017'
+    save_as_tag = 'workshops-2018'
+    conference_name = u'CopyCamp 2018'
     form_title = _('Workshop')
     form_title = _('Workshop')
+    notify_on_register = False
+    mailing_field = 'agree_mailing'
 
 
-    name = forms.CharField(label=_('Name'), max_length=128)
+    first_name = forms.CharField(label=_('First name'), max_length=128)
+    last_name = forms.CharField(label=_('Last name'), max_length=128)
     contact = forms.EmailField(label=_('E-mail'), max_length=128)
     contact = forms.EmailField(label=_('E-mail'), max_length=128)
-    organization = forms.CharField(label=_('Organization'),
-                                   max_length=256, required=False)
+    organization = forms.CharField(label=_('Organization'), max_length=256, required=False)
     country = forms.CharField(label=_('Country'), max_length=128)
 
     _header = HeaderField(
         label=mark_safe_lazy(_("<h3>I'll take a part in workshops</h3>")),
         help_text=_('Only workshops with any spots left are visible here.'))
 
     country = forms.CharField(label=_('Country'), max_length=128)
 
     _header = HeaderField(
         label=mark_safe_lazy(_("<h3>I'll take a part in workshops</h3>")),
         help_text=_('Only workshops with any spots left are visible here.'))
 
-    _h1 = HeaderField(label=mark_safe_lazy(_("<strong>Thursday, October 27th, 10 a.m.–12 noon</strong>")))
-
-    w_dimitrov = forms.BooleanField(label=_(u'Dimitar Dimitrov: Hacking Brussels'), required=False)
-    w_vangompel = forms.BooleanField(label=_(
-        u'Stef van Gompel: Methods and constraints for including evidence in IP lawmaking'), required=False)
-
-    _h2 = HeaderField(label=mark_safe_lazy(_("<strong>Friday, October 28th, 10 a.m.–12 noon</strong>")))
-
-    w_siewicz = forms.BooleanField(label=_(
-        u'dr Krzysztof Siewicz, dr Marta Hoffman-Sommer: '
-        u'Legal aspects of using research data in the age of Open Data'), required=False)
-    w_siewicz_project = forms.CharField(
-        label=mark_safe(
-            u'<p style="margin-top: 0"><strong>Qualification for this workshop will be based on the answers '
-            u'for the following problem:</strong></p>'
-            u'Please choose a particular dataset from any research project you are involved in and provide '
-            u'a description (no more than 1800 characters). Selected datasets will be discussed during '
-            u'the workshop as case studies. In your description, please include the following information: '
-            u'What is the research goal of the project (in the context of the chosen dataset)? '
-            u'What data is being collected and how is it stored? What is the process of data collection '
-            u'or generation? Who is involved in collecting or producing the data and in what manner?'),
-        max_length=1800, widget=forms.Textarea, required=False)
-    w_google = forms.BooleanField(label=_(
-        u'Marcin Olender, Google: Prawo autorskie na YouTube (workshop in Polish)'), required=False)
-
-    _h3 = HeaderField(label=mark_safe_lazy(_("<strong>Friday, October 28th, 12 noon–2 p.m.</strong>")))
-
-    w_patronite = forms.BooleanField(label=_(
-        u'Mateusz Górski, Michał Leksiński, Patronite: Jak zarabiać i się nie sprzedać – warsztaty dla twórców '
-        u'(workshop in Polish)'),
-        required=False)
+    _h1 = HeaderField(label=mark_safe_lazy(_("<strong>Thursday, September 28th, 10 a.m.–12 noon</strong>")))
+
+    w_mileszyk = workshop_field(
+        u'Natalia Mileszyk, Dimitar Dimitrov, Diego Naranjo: School of Rock(ing) Copyright: United to #fixcopyright')
+    w_wang = workshop_field(
+        u'Jacob Riddersholm Wang, Pernille Feldt, Martin Appelt: Heritage gone digital - beyond legal rights')
 
 
-    w_gurionova = forms.BooleanField(label=_(
-        u'Olga Goriunova: The Lurker and the politics of knowledge in data culture'), required=False)
+    _h2 = HeaderField(label=mark_safe_lazy(_("<strong>Thursday, September 28th, 12 noon–2 p.m.</strong>")))
+
+    w_vanderwaal = workshop_field(u'Sander van der Waal, Danny Lämmerhirt: Tackling open license proliferation')
+
+    _h2a = HeaderField(label=mark_safe_lazy(_("<strong>Friday, September 29th, 9 a.m.–11 noon</strong>")))
+
+    w_nobre = workshop_field(u'Teresa Nobre, Paul Keller, Sean Flynn: Researching the Impact of Copyright User Rights')
+    w_nobre_question = forms.CharField(
+        label=mark_safe_lazy(_(
+            u'Please describe the most important recent changes to copyright user rights in your national law. '
+            u'(max 1500 characters)')),
+        max_length=1500, widget=forms.Textarea, required=False)
+
+    _h3 = HeaderField(label=mark_safe_lazy(_("<strong>Friday, September 29th, 10 a.m.–12 noon</strong>")))
+
+    w_youtube = workshop_field(
+        u'Kiki Ganzemüller: YouTube Songwriter Workshop: Rights Management & Building a Presence on YouTube')
+
+    _h4 = HeaderField(label=mark_safe_lazy(_("<strong>Friday, September 29th, 12 noon–2 p.m.</strong>")))
+
+    w_murray = workshop_field(
+        u'Peter Murray-Rust: Wikidata, ContentMine and the automatic liberation of factual data: '
+        u'(The Right to Read is the Right To Mine)')  # 30
+
+    w_zimmermann = workshop_field(u'Jeremie Zimmermann: Hackers ethics and peer-to-peer philosophy in care')
 
     _header_1 = HeaderField(label='')
 
     _header_1 = HeaderField(label='')
+    _header_2 = HeaderField(label='')
 
 
-    start_workshops = ('dimitrov', 'vangompel', 'siewicz', 'google', 'patronite', 'gurionova')
+    start_workshops = ('mileszyk', 'wang', 'vanderwaal', 'nobre', 'youtube', 'murray', 'zimmermann')
 
 
-    slots = (('_h1', 'dimitrov', 'vangompel'), ('_h2', 'siewicz', 'google'), ('_h3', 'patronite', 'gurionova'))
+    slots = (
+        ('_h1', 'mileszyk', 'wang'),
+        ('_h2', 'vanderwaal'),
+        ('_h2a', 'nobre', '_h3', 'youtube'),
+        ('_h4', 'murray', 'zimmermann'),
+    )
+
+    limits = {
+        'mileszyk': 25,
+        'wang': 25,
+        'vanderwaal': 25,
+        'nobre': 25,
+        'youtube': 40,
+        'murray': 35,
+        'zimmermann': 35,
+    }
 
     agree_mailing = forms.BooleanField(
         label=_('I am interested in receiving information about the Modern Poland Foundation\'s activities by e-mail'),
 
     agree_mailing = forms.BooleanField(
         label=_('I am interested in receiving information about the Modern Poland Foundation\'s activities by e-mail'),
@@ -356,7 +385,6 @@ class WorkshopForm(ContactForm):
 
     def __init__(self, *args, **kwargs):
         super(WorkshopForm, self).__init__(*args, **kwargs)
 
     def __init__(self, *args, **kwargs):
         super(WorkshopForm, self).__init__(*args, **kwargs)
-        # self.limit_reached = Contact.objects.filter(form_tag=self.save_as_tag).count() >= 60
         try:
             url = Entry.objects.get(slug_pl='regulamin').get_absolute_url()
             self.fields['agree_toc'] = forms.BooleanField(
         try:
             url = Entry.objects.get(slug_pl='regulamin').get_absolute_url()
             self.fields['agree_toc'] = forms.BooleanField(
@@ -368,21 +396,24 @@ class WorkshopForm(ContactForm):
         counts = {k: 0 for k in self.start_workshops}
         for contact in Contact.objects.filter(form_tag=self.save_as_tag):
             for workshop in self.start_workshops:
         counts = {k: 0 for k in self.start_workshops}
         for contact in Contact.objects.filter(form_tag=self.save_as_tag):
             for workshop in self.start_workshops:
-                if contact.body.get('w_%s' % workshop, False): counts[workshop] += 1
+                if contact.body.get('w_%s' % workshop, False):
+                    counts[workshop] += 1
+                    if workshop == 'youtube' and counts[workshop] == 30:
+                        send_mail(u'Warsztaty YouTube', u'Przekroczono limit 30 osób na warsztaty YouTube',
+                                  'no-reply@copycamp.pl',
+                                  ['krzysztof.siewicz@nowoczesnapolska.org.pl'],
+                                  fail_silently=True)
+
         some_full = False
         for k, v in counts.items():
         some_full = False
         for k, v in counts.items():
-            if v >= 30:
+            if v >= self.limits[k]:
                 some_full = True
                 if 'w_%s' % k in self.fields:
                     del self.fields['w_%s' % k]
                 some_full = True
                 if 'w_%s' % k in self.fields:
                     del self.fields['w_%s' % k]
-                # if k in self.workshops:
-                #     self.workshops.remove(k)
         if not some_full:
             self.fields['_header'].help_text = None
 
     def clean(self):
         if not some_full:
             self.fields['_header'].help_text = None
 
     def clean(self):
-        if self.cleaned_data.get('w_siewicz') and not self.cleaned_data.get('w_siewicz_project'):
-            self._errors['w_siewicz_project'] = [_("Please submit your answer to qualify for this workshop")]
         for slot in self.slots:
             if sum(1 for w in slot if self.cleaned_data.get('w_%s' % w)) > 1:
                 self._errors[slot[0]] = [_("You can't choose more than one workshop during the same period")]
         for slot in self.slots:
             if sum(1 for w in slot if self.cleaned_data.get('w_%s' % w)) > 1:
                 self._errors[slot[0]] = [_("You can't choose more than one workshop during the same period")]