Skip to content

Commit 11c8b52

Browse files
committed
new view changelog
1 parent a2389c5 commit 11c8b52

File tree

10 files changed

+209
-3
lines changed

10 files changed

+209
-3
lines changed

conftest.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import os
2+
import sys
3+
4+
SECRET_KEY = 'test - secret - key'
5+
DATABASES = {
6+
'default': {
7+
'ENGINE': 'django.db.backends.sqlite3',
8+
'NAME': ':memory:',
9+
'HOST': '',
10+
'PORT': '',
11+
'USER': ''},
12+
}
13+
14+
INSTALLED_APPS = ['whatsnew', ]
15+
16+
17+
def pytest_configure(config):
18+
here = os.path.dirname(__file__)
19+
sys.path.insert(0, here)
20+
21+
os.environ['DJANGO_SETTINGS_MODULE'] = 'conftest'
22+
# from django.conf import settings

whatsnew/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class Meta:
2020

2121
class WhatsNewAdmin(ModelAdmin):
2222
change_form_template = 'admin/whatsnew/change_form_whatsnew.html'
23-
list_display = ('version', 'expire', 'enabled')
23+
list_display = ('version', 'date', 'expire', 'enabled')
2424
form = WhatsNewForm
2525

2626

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# -*- coding: utf-8 -*-
2+
import datetime
3+
from south.db import db
4+
from south.v2 import SchemaMigration
5+
from django.db import models
6+
7+
8+
class Migration(SchemaMigration):
9+
10+
def forwards(self, orm):
11+
# Adding field 'WhatsNew.date'
12+
db.add_column(u'whatsnew_whatsnew', 'date',
13+
self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2014, 4, 24, 0, 0), blank=True, auto_now_add=True),
14+
keep_default=False)
15+
16+
17+
def backwards(self, orm):
18+
# Deleting field 'WhatsNew.date'
19+
db.delete_column(u'whatsnew_whatsnew', 'date')
20+
21+
22+
models = {
23+
u'whatsnew.whatsnew': {
24+
'Meta': {'ordering': "('-date',)", 'object_name': 'WhatsNew'},
25+
'content': ('django.db.models.fields.TextField', [], {}),
26+
'date': ('django.db.models.fields.DateField', [], {'blank': 'True', 'auto_now_add': 'True'}),
27+
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
28+
'expire': ('django.db.models.fields.DateField', [], {'blank': 'True', 'null': 'True'}),
29+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
30+
'version': ('whatsnew.fields.VersionField', [], {'max_length': '50'})
31+
}
32+
}
33+
34+
complete_apps = ['whatsnew']

whatsnew/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
class WhatsNew(models.Model):
88
version = VersionField()
9+
date = models.DateField(auto_now_add=True)
910
content = models.TextField()
1011
expire = models.DateField(blank=True, null=True)
1112
enabled = models.BooleanField(default=False)
@@ -14,6 +15,7 @@ def __unicode__(self):
1415
return unicode(self.version)
1516

1617
class Meta:
17-
get_latest_by = 'id'
18+
ordering = '-version',
19+
get_latest_by = 'date'
1820
verbose_name = _("What's New")
1921
verbose_name_plural = _("What's New")
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{% extends "admin/change_form.html" %}
2+
{% load i18n whatsnew %}
3+
4+
5+
{% block object-tools-items %}
6+
<li><a href="{% url 'whatsnew-test' %}" class="whatsnew-preview">{% trans "Preview" %}</a></li>
7+
{{ block.super }}
8+
{% endblock %}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
{% for entry in whatsnew_list %}
3+
{{ entry.content|safe }}
4+
{% endfor %}

whatsnew/tests.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import absolute_import
3+
from django_dynamic_fixture import G
4+
import pytest
5+
6+
from whatsnew import get_version
7+
from whatsnew.models import WhatsNew
8+
from whatsnew.templatetags.whatsnew import whatsnew
9+
from whatsnew.version import Version
10+
from django.test.client import RequestFactory
11+
12+
13+
def test_version():
14+
v100 = Version('1.0.0')
15+
v10 = Version('1.0')
16+
v11 = Version('1.1')
17+
v10a = Version('1.0alpha')
18+
v10b = Version('1.0beta')
19+
v10dev = Version('1.0dev')
20+
v10rc = Version('1.0rc')
21+
22+
v001 = Version('0.0.1')
23+
24+
assert v10 > v001
25+
assert v100 == v10
26+
assert v10 < v11
27+
assert v11 > v10
28+
assert v10a < v10
29+
assert v10b < v10
30+
assert v10dev < v10
31+
assert v10rc < v10
32+
33+
34+
@pytest.mark.django_db
35+
def test_templatetag():
36+
current = get_version()
37+
factory = RequestFactory()
38+
39+
G(WhatsNew, version=current, enabled=True, expire=None)
40+
factory.cookies['whatsnew-whatsnew'] = '0.0'
41+
request = factory.get('/')
42+
ret = whatsnew({'request': request}, 'whatsnew')
43+
44+
assert ret['display']
45+
46+
factory.cookies['whatsnew-whatsnew'] = current
47+
request = factory.get('/')
48+
ret = whatsnew({'request': request}, 'whatsnew')
49+
50+
assert not ret['display']
51+
52+
factory.cookies['whatsnew-whatsnew'] = current + '.1'
53+
request = factory.get('/')
54+
ret = whatsnew({'request': request}, 'whatsnew')
55+
56+
assert not ret['display']

whatsnew/urls.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
from django.conf.urls import patterns, url
22
from django.views.generic import TemplateView
3+
from whatsnew.views import ChangelogView
34

45

56
urlpatterns = patterns(
67
'whatsnew.views',
7-
url(r'^test/', TemplateView.as_view(template_name='whatsnew/test.html'), name='whatsnew-test'),
8+
url(r'^test/', TemplateView.as_view(template_name='whatsnew/test.html'),
9+
name='whatsnew-test'),
10+
url(r'^changelog/', ChangelogView.as_view(),
11+
name='whatsnew-changelog'),
812
# url(r'^latest/$', 'latest', name='whatsnew-latest'),
913
)

whatsnew/version.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from types import StringTypes
2+
import pkg_resources
3+
4+
5+
class Version(object):
6+
def __init__(self, vstring):
7+
self._components = pkg_resources.parse_version(vstring)
8+
self.string = vstring
9+
self._patch = []
10+
for i, part in enumerate(self._components):
11+
if '*' in part:
12+
break
13+
if len(self._components) > i:
14+
self._patch = map(lambda x: x.replace('*', ''), self._components[i + 1:-1])
15+
parts = list(self._components[:i])
16+
parts.extend('0' * (3 - len(parts)))
17+
18+
self._parts = map(int, parts)
19+
20+
self._status = self._components[i][1]
21+
22+
def same(self, other):
23+
return self._parts == other._parts
24+
25+
def __str__(self):
26+
return self.string
27+
28+
def __repr__(self):
29+
return "Version ('%s')" % str(self)
30+
31+
def __unicode__(self):
32+
return unicode(str(self))
33+
34+
def __cmp__(self, other):
35+
if isinstance(other, StringTypes):
36+
other = Version(other)
37+
if not other:
38+
return None
39+
return cmp(self._components, other._components)
40+
41+
@property
42+
def major(self):
43+
return self._parts[0]
44+
45+
@property
46+
def minor(self):
47+
return self._parts[1]
48+
49+
@property
50+
def release(self):
51+
return self._parts[2]
52+
53+
@property
54+
def patch(self):
55+
return ".".join(self._patch)
56+
57+
@property
58+
def status(self):
59+
if self._status == '@':
60+
return "nighlybuild"
61+
return self._status
62+
63+
@property
64+
def version(self):
65+
return self._parts + [self.status] + [self.patch]

whatsnew/views.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django.views.generic.base import TemplateView
2+
from django.views.generic.list import ListView
3+
from whatsnew.models import WhatsNew
4+
5+
6+
class ChangelogView(ListView):
7+
template_name='whatsnew/changelog.html'
8+
model = WhatsNew
9+
10+
def get_queryset(self):
11+
return self.model._default_manager.all().order_by('-version')

0 commit comments

Comments
 (0)