Skip to content

Commit

Permalink
Rewrite django-announcements
Browse files Browse the repository at this point in the history
  • Loading branch information
paltman committed Nov 11, 2011
1 parent 75eca7b commit a5a9200
Show file tree
Hide file tree
Showing 23 changed files with 550 additions and 419 deletions.
10 changes: 1 addition & 9 deletions announcements/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1 @@
VERSION = (0, 1, 0, "final")

def get_version():
if VERSION[3] != "final":
return "%s.%s.%s%s" % (VERSION[0], VERSION[1], VERSION[2], VERSION[3])
else:
return "%s.%s.%s" % (VERSION[0], VERSION[1], VERSION[2])

__version__ = get_version()
__version__ = "0.2.0.dev1"
11 changes: 3 additions & 8 deletions announcements/admin.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
from django.contrib import admin

from announcements.models import Announcement
from announcements.forms import AnnouncementAdminForm
from announcements.models import Announcement, Dismissal


class AnnouncementAdmin(admin.ModelAdmin):
list_display = ("title", "creator", "creation_date", "members_only")
list_filter = ("members_only",)
form = AnnouncementAdminForm
fieldsets = [
(None, {
"fields": ["title", "content", "site_wide", "members_only"],
}),

("Manage announcement", {
"fields": ["send_now"],
"fields": ["title", "content", "site_wide", "members_only", "publish_start", "publish_end", "dismissal_type"],
}),
]

Expand All @@ -26,3 +20,4 @@ def save_model(self, request, obj, form, change):


admin.site.register(Announcement, AnnouncementAdmin)
admin.site.register(Dismissal)
9 changes: 0 additions & 9 deletions announcements/context_processors.py

This file was deleted.

14 changes: 13 additions & 1 deletion announcements/feeds.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import datetime

from django.db.models import Q

from atomformat import Feed

from announcements.models import Announcement
Expand All @@ -16,7 +20,15 @@ class AnnouncementsBase(Feed):
# def item_links

def items(self):
return Announcement.objects.order_by("-creation_date")[:10]
return Announcement.objects.filter(
publish_start__lte=datetime.datetime.now()
).filter(
Q(publish_end__isnull=True)|Q(publish_end__gt=datetime.datetime.now())
).filter(
site_wide=True
).exclude(
members_only=True
).order_by("-creation_date")[:10]

def item_title(self, item):
return item.title
Expand Down
40 changes: 0 additions & 40 deletions announcements/forms.py

This file was deleted.

16 changes: 0 additions & 16 deletions announcements/management.py

This file was deleted.

83 changes: 25 additions & 58 deletions announcements/models.py
Original file line number Diff line number Diff line change
@@ -1,63 +1,41 @@
from datetime import datetime
import datetime

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _

try:
set
except NameError:
from sets import Set as set # Python 2.3 fallback


class AnnouncementManager(models.Manager):
"""
A basic manager for dealing with announcements.
"""
def current(self, exclude=[], site_wide=False, for_members=False):
"""
Fetches and returns a queryset with the current announcements. This
method takes the following parameters:
``exclude``
A list of IDs that should be excluded from the queryset.
``site_wide``
A boolean flag to filter to just site wide announcements.
``for_members``
A boolean flag to allow member only announcements to be returned
in addition to any others.
"""
queryset = self.all()
if site_wide:
queryset = queryset.filter(site_wide=True)
if exclude:
queryset = queryset.exclude(pk__in=exclude)
if not for_members:
queryset = queryset.filter(members_only=False)
queryset = queryset.order_by("-creation_date")
return queryset


class Announcement(models.Model):
"""
A single announcement.
"""
DISMISSAL_NO = 1
DISMISSAL_SESSION = 2
DISMISSAL_PERMANENT = 3

DISMISSAL_CHOICES = [
(DISMISSAL_NO, "No Dismissals Allowed"),
(DISMISSAL_SESSION, "Session Only Dismissal"),
(DISMISSAL_PERMANENT, "Permanent Dismissal Allowed")
]

title = models.CharField(_("title"), max_length=50)
content = models.TextField(_("content"))
creator = models.ForeignKey(User, verbose_name=_("creator"))
creation_date = models.DateTimeField(_("creation_date"), default=datetime.now)
creation_date = models.DateTimeField(_("creation_date"), default=datetime.datetime.now)
site_wide = models.BooleanField(_("site wide"), default=False)
members_only = models.BooleanField(_("members only"), default=False)

objects = AnnouncementManager()
dismissal_type = models.IntegerField(choices=DISMISSAL_CHOICES, default=DISMISSAL_SESSION)
publish_start = models.DateTimeField(_("publish_start"), default=datetime.datetime.now)
publish_end = models.DateTimeField(_("publish_end"), blank=True, null=True)

def get_absolute_url(self):
return ("announcement_detail", [str(self.pk)])
get_absolute_url = models.permalink(get_absolute_url)
return reverse("announcement_detail", args=[self.pk])

def dismiss_url(self):
if self.dismissal_type != Announcement.DISMISSAL_NO:
return reverse("announcement_dismiss", args=[self.pk])

def __unicode__(self):
return self.title
Expand All @@ -67,20 +45,9 @@ class Meta:
verbose_name_plural = _("announcements")


def current_announcements_for_request(request, **kwargs):
"""
A helper function to get the current announcements based on some data from
the HttpRequest.
class Dismissal(models.Model):

If request.user is authenticated then allow the member only announcements
to be returned.
Exclude announcements that have already been viewed by the user based on
the ``excluded_announcements`` session variable.
"""
defaults = {}
if request.user.is_authenticated():
defaults["for_members"] = True
defaults["exclude"] = request.session.get("excluded_announcements", set())
defaults.update(kwargs)
return Announcement.objects.current(**defaults)
user = models.ForeignKey(User, related_name="announcement_dismissals")
announcement = models.ForeignKey(Announcement, related_name="dismissals")
dismissed_at = models.DateTimeField(default=datetime.datetime.now)

3 changes: 0 additions & 3 deletions announcements/templates/notification/announcement/full.txt

This file was deleted.

36 changes: 0 additions & 36 deletions announcements/templatetags/announcement_tags.py

This file was deleted.

52 changes: 52 additions & 0 deletions announcements/templatetags/announcements_tags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import datetime

from django import template
from django.db.models import Q

from announcements.models import Announcement


register = template.Library()


class AnnouncementsNode(template.Node):

@classmethod
def handle_token(cls, parser, token):
bits = token.split_contents()
if len(bits) != 3:
raise template.TemplateSyntaxError
return cls(as_var = bits[2])

def __init__(self, as_var):
self.as_var = as_var

def render(self, context):
request = context["request"]
qs = Announcement.objects.filter(
publish_start__lte=datetime.datetime.now()
).filter(
Q(publish_end__isnull=True)|Q(publish_end__gt=datetime.datetime.now())
).filter(
site_wide=True
)

exclusions = request.session.get("excluded_announcements", set())
if request.user.is_authenticated():
for dismissal in request.user.announcement_dismissals.all():
exclusions.add(dismissal.announcement.pk)
else:
qs = qs.exclude(members_only=True)
context[self.as_var] = qs.exclude(pk__in=exclusions)
return ""


@register.tag
def announcements(parser, token):
"""
Usage::
{% announcements as var %}
Returns a list of announcements
"""
return AnnouncementsNode.handle_token(parser, token)
35 changes: 0 additions & 35 deletions announcements/tests.py

This file was deleted.

15 changes: 2 additions & 13 deletions announcements/urls.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,7 @@
from django.conf.urls.defaults import *
from django.views.generic import list_detail

from announcements.models import Announcement
from announcements.views import *


announcement_detail_info = {
"queryset": Announcement.objects.all(),
}

urlpatterns = patterns("",
url(r"^(?P<object_id>\d+)/$", list_detail.object_detail,
announcement_detail_info, name="announcement_detail"),
url(r"^(?P<object_id>\d+)/hide/$", announcement_hide,
name="announcement_hide"),
url(r"^$", announcement_list, name="announcement_home"),
url(r"^(?P<pk>\d+)/$", "announcements.views.detail", name="announcements_detail"),
url(r"^(?P<pk>\d+)/hide/$", "announcements.views.dismiss", name="announcement_dismiss")
)
Loading

0 comments on commit a5a9200

Please sign in to comment.