From 65b21e2291997e97e51412fb9cd9d5968a158b0f Mon Sep 17 00:00:00 2001
From: Guillaume Pellerin 
Date: Tue, 3 Jan 2017 16:59:31 +0100
Subject: [PATCH] Add login for blocks, add project block template with login
 option
---
 .../0021_eventblock_login_required.py         | 20 ++++++
 app/organization/core/models.py               |  1 +
 app/organization/core/views.py                |  2 +-
 app/organization/media/views.py               |  2 +
 .../migrations/0077_auto_20170103_1220.py     | 25 ++++++++
 .../0017_pageblock_login_required.py          | 20 ++++++
 .../0035_projectblock_login_required.py       | 20 ++++++
 .../migrations/0036_auto_20170103_1227.py     | 46 ++++++++++++++
 app/organization/projects/models.py           |  1 -
 app/organization/projects/translation.py      |  2 +-
 app/organization/projects/views.py            | 61 ++++++++-----------
 app/templates/accounts/account_login.html     |  1 -
 app/templates/core/inc/block.html             |  2 +-
 app/templates/projects/inc/project_block.html | 45 ++++++++++++++
 app/templates/projects/project_detail.html    |  2 +-
 15 files changed, 210 insertions(+), 40 deletions(-)
 create mode 100644 app/organization/agenda/migrations/0021_eventblock_login_required.py
 create mode 100644 app/organization/network/migrations/0077_auto_20170103_1220.py
 create mode 100644 app/organization/pages/migrations/0017_pageblock_login_required.py
 create mode 100644 app/organization/projects/migrations/0035_projectblock_login_required.py
 create mode 100644 app/organization/projects/migrations/0036_auto_20170103_1227.py
 create mode 100644 app/templates/projects/inc/project_block.html
diff --git a/app/organization/agenda/migrations/0021_eventblock_login_required.py b/app/organization/agenda/migrations/0021_eventblock_login_required.py
new file mode 100644
index 00000000..b74c3cac
--- /dev/null
+++ b/app/organization/agenda/migrations/0021_eventblock_login_required.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-01-03 11:20
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-agenda', '0020_auto_20161205_1536'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='eventblock',
+            name='login_required',
+            field=models.BooleanField(default=False, verbose_name='login required'),
+        ),
+    ]
diff --git a/app/organization/core/models.py b/app/organization/core/models.py
index 50c1343e..529849d6 100644
--- a/app/organization/core/models.py
+++ b/app/organization/core/models.py
@@ -100,6 +100,7 @@ class Block(RichText, Titled, Orderable):
 
     with_separator = models.BooleanField(default=False)
     background_color = models.CharField(_('background color'), max_length=32, choices=COLOR_CHOICES, blank=True)
+    login_required = models.BooleanField(_('login required'), default=False)
 
     class Meta:
         abstract = True
diff --git a/app/organization/core/views.py b/app/organization/core/views.py
index 954d9123..bb386a77 100644
--- a/app/organization/core/views.py
+++ b/app/organization/core/views.py
@@ -22,7 +22,7 @@
 from django.shortcuts import render, get_object_or_404
 from django.http import Http404
 from django.views.generic.base import View
-from django.views.generic import DetailView, ListView, TemplateView
+from django.views.generic import DetailView, ListView, TemplateView, UpdateView
 from django.apps import apps
 from django.utils import six, timezone, formats
 from django.utils.translation import ugettext_lazy as _
diff --git a/app/organization/media/views.py b/app/organization/media/views.py
index 851549e7..d5c16d4a 100644
--- a/app/organization/media/views.py
+++ b/app/organization/media/views.py
@@ -73,6 +73,7 @@ class PlaylistListView(ListView):
     model = Playlist
     template_name='media/playlist_list.html'
     context_object_name = 'playlists'
+
     def get_queryset(self):
         self.qs = Playlist.objects.all()
         self.current_type = None
@@ -80,6 +81,7 @@ class PlaylistListView(ListView):
             self.qs = self.qs.filter(type=self.kwargs['type'])
             self.current_type = self.kwargs['type']
         return self.qs
+
     def get_context_data(self, **kwargs):
         context = super(PlaylistListView, self).get_context_data(**kwargs)
 
diff --git a/app/organization/network/migrations/0077_auto_20170103_1220.py b/app/organization/network/migrations/0077_auto_20170103_1220.py
new file mode 100644
index 00000000..58fdf797
--- /dev/null
+++ b/app/organization/network/migrations/0077_auto_20170103_1220.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-01-03 11:20
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-network', '0076_auto_20161230_1839'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='organizationblock',
+            name='login_required',
+            field=models.BooleanField(default=False, verbose_name='login required'),
+        ),
+        migrations.AddField(
+            model_name='personblock',
+            name='login_required',
+            field=models.BooleanField(default=False, verbose_name='login required'),
+        ),
+    ]
diff --git a/app/organization/pages/migrations/0017_pageblock_login_required.py b/app/organization/pages/migrations/0017_pageblock_login_required.py
new file mode 100644
index 00000000..5c2866d7
--- /dev/null
+++ b/app/organization/pages/migrations/0017_pageblock_login_required.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-01-03 11:20
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-pages', '0016_auto_20161205_1536'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='pageblock',
+            name='login_required',
+            field=models.BooleanField(default=False, verbose_name='login required'),
+        ),
+    ]
diff --git a/app/organization/projects/migrations/0035_projectblock_login_required.py b/app/organization/projects/migrations/0035_projectblock_login_required.py
new file mode 100644
index 00000000..12a37d78
--- /dev/null
+++ b/app/organization/projects/migrations/0035_projectblock_login_required.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-01-03 11:20
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-projects', '0034_auto_20161230_1839'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='projectblock',
+            name='login_required',
+            field=models.BooleanField(default=False, verbose_name='login required'),
+        ),
+    ]
diff --git a/app/organization/projects/migrations/0036_auto_20170103_1227.py b/app/organization/projects/migrations/0036_auto_20170103_1227.py
new file mode 100644
index 00000000..02072f68
--- /dev/null
+++ b/app/organization/projects/migrations/0036_auto_20170103_1227.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2017-01-03 11:27
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import mezzanine.core.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-projects', '0035_projectblock_login_required'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='projectblock',
+            name='content_en',
+            field=mezzanine.core.fields.RichTextField(null=True, verbose_name='Content'),
+        ),
+        migrations.AddField(
+            model_name='projectblock',
+            name='content_fr',
+            field=mezzanine.core.fields.RichTextField(null=True, verbose_name='Content'),
+        ),
+        migrations.AddField(
+            model_name='projectblock',
+            name='description_en',
+            field=models.TextField(blank=True, null=True, verbose_name='description'),
+        ),
+        migrations.AddField(
+            model_name='projectblock',
+            name='description_fr',
+            field=models.TextField(blank=True, null=True, verbose_name='description'),
+        ),
+        migrations.AddField(
+            model_name='projectblock',
+            name='title_en',
+            field=models.CharField(max_length=1024, null=True, verbose_name='title'),
+        ),
+        migrations.AddField(
+            model_name='projectblock',
+            name='title_fr',
+            field=models.CharField(max_length=1024, null=True, verbose_name='title'),
+        ),
+    ]
diff --git a/app/organization/projects/models.py b/app/organization/projects/models.py
index af207b34..d5c85d67 100644
--- a/app/organization/projects/models.py
+++ b/app/organization/projects/models.py
@@ -149,7 +149,6 @@ class ProjectFile(File):
 
 class ProjectBlock(Block):
 
-
     project = models.ForeignKey(Project, verbose_name=_('project'), related_name='blocks', blank=True, null=True, on_delete=models.SET_NULL)
 
 
diff --git a/app/organization/projects/translation.py b/app/organization/projects/translation.py
index 2b3a87a0..3ce5a108 100644
--- a/app/organization/projects/translation.py
+++ b/app/organization/projects/translation.py
@@ -51,7 +51,7 @@ class ProjectFileTranslationOptions(TranslationOptions):
 @register(ProjectBlock)
 class ProjectBlockTranslationOptions(TranslationOptions):
 
-    pass
+    fields = ('title', 'description', 'content')
 
 
 @register(ProjectLink)
diff --git a/app/organization/projects/views.py b/app/organization/projects/views.py
index c3870f25..cdb02a88 100644
--- a/app/organization/projects/views.py
+++ b/app/organization/projects/views.py
@@ -29,31 +29,41 @@ from organization.core.views import *
 from organization.magazine.views import Article
 from organization.pages.models import CustomPage
 
-class ProjectDetailView(SlugMixin, DetailView):
 
-    model = Project
-    template_name='projects/project_detail.html'
-    context_object_name = 'project'
+class ProjectMixin(object):
 
-    def get_context_data(self, **kwargs):
-        context = super(ProjectDetailView, self).get_context_data(**kwargs)
-        project = self.get_object()
+    def get_context_data_mixin(self, context):
         department = None
 
-        if project.lead_team:
-            if project.lead_team.department:
-                department = project.lead_team.department
+        if self.project.lead_team:
+            if self.project.lead_team.department:
+                department = self.project.lead_team.department
         else:
-            for team in project.teams.all():
+            for team in self.project.teams.all():
                 if team.department:
                     department = team.department
                     break
 
         context['department'] = department
-        if project.topic and project.topic.parent:
-            context['page'] = project.topic.parent.pages.all().first()
-        elif project.topic:
-            context['page'] = project.topic.pages.all().first()
+        if self.project.topic and self.project.topic.parent:
+            context['page'] = self.project.topic.parent.pages.all().first()
+        elif self.project.topic:
+            context['page'] = self.project.topic.pages.all().first()
+
+        return context
+
+
+class ProjectDetailView(SlugMixin, ProjectMixin, DetailView):
+
+    model = Project
+    template_name='projects/project_detail.html'
+    context_object_name = 'project'
+
+    def get_context_data(self, **kwargs):
+        context = super(ProjectDetailView, self).get_context_data(**kwargs)
+        self.project = self.get_object()
+        self.get_context_data_mixin(context)
+        context['next'] = reverse_lazy('organization-project-detail', kwargs={'slug': self.project.slug})
         return context
 
 
@@ -86,7 +96,7 @@ class DynamicContentProjectView(Select2QuerySetSequenceView):
         return results
 
 
-class ProjectDemoDetailView(SlugMixin, DetailView):
+class ProjectDemoDetailView(SlugMixin, ProjectMixin, DetailView):
 
     model = ProjectDemo
     template_name='projects/project_demo_detail.html'
@@ -96,22 +106,5 @@ class ProjectDemoDetailView(SlugMixin, DetailView):
         context = super(ProjectDemoDetailView, self).get_context_data(**kwargs)
         demo = self.get_object()
         project = demo.project
-        department = None
-
-        if project:
-            if project.lead_team:
-                if project.lead_team.department:
-                    department = project.lead_team.department
-            else:
-                for team in project.teams.all():
-                    if team.department:
-                        department = team.department
-                        break
-
-            context['department'] = department
-            if project.topic and project.topic.parent:
-                context['page'] = project.topic.parent.pages.all().first()
-            elif project.topic:
-                context['page'] = project.topic.pages.all().first()
-
+        self.get_context_data_mixin(context)
         return context
diff --git a/app/templates/accounts/account_login.html b/app/templates/accounts/account_login.html
index 9bd1a402..4fbbbaf5 100644
--- a/app/templates/accounts/account_login.html
+++ b/app/templates/accounts/account_login.html
@@ -20,7 +20,6 @@
 {% else %}
     {% include 'accounts/account_form.html'%}
     {% url "signup" as signup_url %}
-    {% blocktrans with request.GET.next as next %}If you don't have an account you can sign up for one now.{% endblocktrans %}
     {% url "mezzanine_password_reset" as password_reset_url %}
     {% url "profile_update" as profile_update_url %}
     {% blocktrans %}You can also reset your password if you've forgotten it.
{% endblocktrans %}
diff --git a/app/templates/core/inc/block.html b/app/templates/core/inc/block.html
index 8524a175..bdc2f697 100644
--- a/app/templates/core/inc/block.html
+++ b/app/templates/core/inc/block.html
@@ -1,7 +1,7 @@
 {% load i18n mezzanine_tags keyword_tags pages_tags organization_tags %}
 {% if blocks %}
     
-        {% if blocks.first.content %}
+        {% if blocks.first %}
         
         {% endif %}
         {% for block in blocks %}
diff --git a/app/templates/projects/inc/project_block.html b/app/templates/projects/inc/project_block.html
new file mode 100644
index 00000000..162e5774
--- /dev/null
+++ b/app/templates/projects/inc/project_block.html
@@ -0,0 +1,45 @@
+{% load i18n mezzanine_tags keyword_tags pages_tags organization_tags %}
+{% if blocks %}
+    
+        {% for block in blocks %}
+            {% if block.content %}
+                {% if not forloop.first and block.with_separator %}
+                    
+                {% endif %}
+                
+                    
+                        
+                            
+                                {% editable block.title %}
+                                    
{{ block.title }}
+                                {% endeditable %}
+                                {% if block.description %}
+                                    
+                                        {% editable block.description %}
+                                            {{ block.description }}
+                                        {% endeditable %}
+                                    
+                                {% endif %}
+                                {% if block.login_required and not user.is_authenticated %}
+                                    
+                                {% else %}
+                                    {% if block.content %}
+                                        {% editable block.content %}
+                                            {{ block.content|richtext_filters|safe }}
+                                        {% endeditable %}
+                                    {% endif %}
+                                {% endif %}
+                            
+                        
+                    
+                
+            {% endif %}
+        {% endfor %}
+      {% if blocks.last %}
+        
+      {% endif %}
+    
+{% endif %}
diff --git a/app/templates/projects/project_detail.html b/app/templates/projects/project_detail.html
index 07137d54..267db9dc 100644
--- a/app/templates/projects/project_detail.html
+++ b/app/templates/projects/project_detail.html
@@ -269,7 +269,7 @@
     {% endif %}
 
     {% with project.blocks.all as blocks %}
-        {% include "core/inc/block.html" %}
+        {% include "projects/inc/project_block.html" %}
     {% endwith %}
 {% endblock %}
 
-- 
2.39.5