]> git.0d.be Git - django-panik-newsletter.git/commitdiff
add model, views and forms for writing newsletters
authorFrédéric Péters <fpeters@0d.be>
Mon, 23 Sep 2013 21:27:18 +0000 (23:27 +0200)
committerFrédéric Péters <fpeters@0d.be>
Mon, 23 Sep 2013 21:27:18 +0000 (23:27 +0200)
newsletter/forms.py
newsletter/migrations/0001_initial.py [new file with mode: 0644]
newsletter/migrations/0002_auto__add_newsletter.py [new file with mode: 0644]
newsletter/migrations/0003_auto__del_field_newsletter_expedition_date__add_field_newsletter_exped.py [new file with mode: 0644]
newsletter/migrations/__init__.py [new file with mode: 0644]
newsletter/models.py
newsletter/templates/newsletter/newsletter_detail.html [new file with mode: 0644]
newsletter/templates/newsletter/newsletter_form.html [new file with mode: 0644]
newsletter/templates/newsletter/newsletter_list.html [new file with mode: 0644]
newsletter/urls.py
newsletter/views.py

index 79bdfc02ddfbf8b388af3e88fecfa9821e55dc4d..027e7232d5fb814139869737cd0e767d82500647 100644 (file)
@@ -1,7 +1,13 @@
 from django import forms
-from .models import Subscriber
+from .models import Subscriber, Newsletter
 
 class SubscribeForm(forms.ModelForm):
     class Meta:
         model = Subscriber
         exclude = ('inscription_date', 'is_validated', 'is_registered', 'password')
+
+
+class NewsletterForm(forms.ModelForm):
+    class Meta:
+        model = Newsletter
+        exclude = ('expedition_datetime', )
diff --git a/newsletter/migrations/0001_initial.py b/newsletter/migrations/0001_initial.py
new file mode 100644 (file)
index 0000000..7d379dc
--- /dev/null
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'Subscriber'
+        db.create_table(u'newsletter_subscriber', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('email', self.gf('django.db.models.fields.EmailField')(unique=True, max_length=75)),
+            ('inscription_date', self.gf('django.db.models.fields.DateField')(auto_now_add=True, blank=True)),
+            ('is_validated', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+            ('is_registered', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+            ('password', self.gf('django.db.models.fields.CharField')(max_length=100)),
+        ))
+        db.send_create_signal(u'newsletter', ['Subscriber'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'Subscriber'
+        db.delete_table(u'newsletter_subscriber')
+
+
+    models = {
+        u'newsletter.subscriber': {
+            'Meta': {'object_name': 'Subscriber'},
+            'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'inscription_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'is_registered': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'is_validated': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        }
+    }
+
+    complete_apps = ['newsletter']
\ No newline at end of file
diff --git a/newsletter/migrations/0002_auto__add_newsletter.py b/newsletter/migrations/0002_auto__add_newsletter.py
new file mode 100644 (file)
index 0000000..033c01a
--- /dev/null
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'Newsletter'
+        db.create_table(u'newsletter_newsletter', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('subject', self.gf('django.db.models.fields.CharField')(max_length=50)),
+            ('date', self.gf('django.db.models.fields.DateField')()),
+            ('text', self.gf('ckeditor.fields.RichTextField')(null=True, blank=True)),
+            ('expedition_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)),
+        ))
+        db.send_create_signal(u'newsletter', ['Newsletter'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'Newsletter'
+        db.delete_table(u'newsletter_newsletter')
+
+
+    models = {
+        u'newsletter.newsletter': {
+            'Meta': {'ordering': "['date']", 'object_name': 'Newsletter'},
+            'date': ('django.db.models.fields.DateField', [], {}),
+            'expedition_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'subject': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'text': ('ckeditor.fields.RichTextField', [], {'null': 'True', 'blank': 'True'})
+        },
+        u'newsletter.subscriber': {
+            'Meta': {'object_name': 'Subscriber'},
+            'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'inscription_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'is_registered': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'is_validated': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        }
+    }
+
+    complete_apps = ['newsletter']
\ No newline at end of file
diff --git a/newsletter/migrations/0003_auto__del_field_newsletter_expedition_date__add_field_newsletter_exped.py b/newsletter/migrations/0003_auto__del_field_newsletter_expedition_date__add_field_newsletter_exped.py
new file mode 100644 (file)
index 0000000..f4322e1
--- /dev/null
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Deleting field 'Newsletter.expedition_date'
+        db.delete_column(u'newsletter_newsletter', 'expedition_date')
+
+        # Adding field 'Newsletter.expedition_datetime'
+        db.add_column(u'newsletter_newsletter', 'expedition_datetime',
+                      self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Adding field 'Newsletter.expedition_date'
+        db.add_column(u'newsletter_newsletter', 'expedition_date',
+                      self.gf('django.db.models.fields.DateField')(null=True, blank=True),
+                      keep_default=False)
+
+        # Deleting field 'Newsletter.expedition_datetime'
+        db.delete_column(u'newsletter_newsletter', 'expedition_datetime')
+
+
+    models = {
+        u'newsletter.newsletter': {
+            'Meta': {'ordering': "['date']", 'object_name': 'Newsletter'},
+            'date': ('django.db.models.fields.DateField', [], {}),
+            'expedition_datetime': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'subject': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'text': ('ckeditor.fields.RichTextField', [], {'null': 'True', 'blank': 'True'})
+        },
+        u'newsletter.subscriber': {
+            'Meta': {'object_name': 'Subscriber'},
+            'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'inscription_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'is_registered': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'is_validated': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        }
+    }
+
+    complete_apps = ['newsletter']
\ No newline at end of file
diff --git a/newsletter/migrations/__init__.py b/newsletter/migrations/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
index 9c3a056cb6900090f3ac0a5354e389fb878cca35..5c30402cc8675949aa319c9a4b0138d958a9fa74 100644 (file)
@@ -9,9 +9,12 @@ from django.db import models
 from django.template import loader, Context 
 from django.conf import settings
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext
+from django.utils.translation import ugettext_lazy as _
 from django.core.mail import send_mail
-# rajout d'un commentaire inutile
+
+from ckeditor.fields import RichTextField
+
 
 class Subscriber(models.Model) :
     email = models.EmailField(unique = True)   # TODO : informer si déjà inscrit ? Que faire dans ce cas.
@@ -44,3 +47,17 @@ class Subscriber(models.Model) :
             return
         self.is_registered = True
         self.save()
+
+
+class Newsletter(models.Model):
+
+    class Meta:
+        verbose_name = _('Newsletter')
+        verbose_name_plural = _('Newsletters')
+        ordering = ['date']
+
+    subject = models.CharField(_('Title'), max_length=50)
+    date = models.DateField(_('Date'))
+    text = RichTextField(_('Text'), null=True, blank=True)
+
+    expedition_datetime = models.DateTimeField(_('Expedition Date/time'), null=True, blank=True)
diff --git a/newsletter/templates/newsletter/newsletter_detail.html b/newsletter/templates/newsletter/newsletter_detail.html
new file mode 100644 (file)
index 0000000..81a8425
--- /dev/null
@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+
+{% block appbar %}
+<h2>{{ object.date }}</h2>
+{% endblock %}
+
+{% block content %}
+
+{% if perms.newsletter.add_newsletter %}
+<p>
+<a class="big-friendly-button" href="{% url 'newsletter-edit' pk=object.id %}">Modifier</a>
+<a class="big-friendly-button" href="#">Envoyer</a>
+</p>
+{% endif %}
+
+{% if newsletter.text %}
+{{ newsletter.text|safe }}
+{% endif %}
+
+{% endblock %}
diff --git a/newsletter/templates/newsletter/newsletter_form.html b/newsletter/templates/newsletter/newsletter_form.html
new file mode 100644 (file)
index 0000000..2f218ee
--- /dev/null
@@ -0,0 +1,27 @@
+{% extends "base.html" %}
+
+{% block extrascripts %}
+<script src="{{ STATIC_URL }}ckeditor/ckeditor/ckeditor.js">
+</script>
+{% endblock %}
+
+{% block appbar %}
+{% if object %}
+<h2>{{ object.date }}</h2>
+{% else %}
+<h2>Nouvelle newsletter</h2>
+{% endif %}
+{% endblock %}
+
+{% block content %}
+    <form method="post">
+      <div id="form-content">
+        {% csrf_token %}
+        {{ form.as_p }}
+      </div>
+      {% block buttons %}
+      <button class="enable-on-change">Enregistrer</button>
+      {% endblock %}
+    </form>
+{% endblock %}
+
diff --git a/newsletter/templates/newsletter/newsletter_list.html b/newsletter/templates/newsletter/newsletter_list.html
new file mode 100644 (file)
index 0000000..d81f34b
--- /dev/null
@@ -0,0 +1,22 @@
+{% extends "base.html" %}
+
+{% block appbar %}
+<h2>Newsletters</h2>
+</span>
+{% endblock %}
+
+{% block content %}
+
+{% if perms.newsletter.add_newsletter %}
+<p>
+<a class="big-friendly-button" href="{% url 'newsletter-create' %}">Nouvelle</a>
+</p>
+{% endif %}
+
+<ul class="emission-list">
+{% for newsletter in object_list %}
+<li><a href="{% url 'newsletter-view' pk=newsletter.id %}/">{{ newsletter.date }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
index be8538b08af1f4e7508d17f6cf58d65a514eff3a..5ee01b956778508b492eca21784e5e7e49756cd2 100644 (file)
@@ -8,3 +8,10 @@ urlpatterns = patterns('',
     url(r'^(?P<token>[0-9a-f]{40})$', 'newsletter.views.confirmation', name='newsletter-confirmation'),
     url(r'^unsubscription/$', unsubscription),
 )
+
+management_patterns = patterns('newsletter.views',
+    url(r'^$', 'newsletter_list', name='newsletter-list'),
+    url(r'^add$', 'newsletter_create', name='newsletter-create'),
+    url(r'^(?P<pk>\d+)/$', 'newsletter_view', name='newsletter-view'),
+    url(r'^(?P<pk>\d+)/edit$', 'newsletter_update', name='newsletter-edit'),
+)
index b063bd01a8525aea7162800ad3d30ebd7b0e8172..b9f6a661f24507804293e0c91158df9e44fd1f42 100644 (file)
@@ -6,18 +6,24 @@ import socket
 import urllib
 import urllib2
 import cookielib
+import datetime
 
 from smtplib import SMTPException 
 
 from django.conf import settings
+from django.core.exceptions import PermissionDenied
+from django.core.urlresolvers import reverse_lazy
 from django.db import models, IntegrityError
 from django.shortcuts import get_object_or_404
 from django.utils.translation import ugettext as _
+
 from django.views.generic.base import TemplateView
-from django.views.generic.edit import CreateView
+from django.views.generic.detail import DetailView
+from django.views.generic.list import ListView
+from django.views.generic.edit import CreateView, UpdateView
 
-from .forms import SubscribeForm
-from .models import Subscriber
+from .forms import SubscribeForm, NewsletterForm
+from .models import Subscriber, Newsletter
 
 
 class SubscribeView(CreateView):
@@ -79,3 +85,45 @@ def unsubscription(request) :
             except Subscriber.DoesNotExist :
                 error_message = _("The entered email address does not exist. Please try another one.")
                 return render(request, 'unsubscription_form.html', {'form' : form, 'message' : error_message})
+
+
+class NewsletterCreateView(CreateView):
+    form_class = NewsletterForm
+    model = Newsletter
+
+    success_url = reverse_lazy('newsletter-list')
+
+    def get_form(self, *args, **kwargs):
+        if not self.request.user.has_perm('newsletter.add_newsletter'):
+            raise PermissionDenied()
+        return super(NewsletterCreateView, self).get_form(*args, **kwargs)
+
+    def get_initial(self):
+        initial = super(NewsletterCreateView, self).get_initial()
+        initial['date'] = datetime.datetime.today()
+        return initial
+
+newsletter_create = NewsletterCreateView.as_view()
+
+
+class NewsletterListView(ListView):
+    model = Newsletter
+
+newsletter_list = NewsletterListView.as_view()
+
+
+class NewsletterDetailView(DetailView):
+    model = Newsletter
+
+newsletter_view = NewsletterDetailView.as_view()
+
+class NewsletterUpdateView(UpdateView):
+    form_class = NewsletterForm
+    model = Newsletter
+
+    def get_form(self, *args, **kwargs):
+        if not self.request.user.has_perm('newsletter.add_newsletter'):
+            raise PermissionDenied()
+        return super(NewsletterUpdateView, self).get_form(*args, **kwargs)
+
+newsletter_update = NewsletterUpdateView.as_view()