Skip to content

Commit 937801b

Browse files
committed
on-goin dev: search, dataset, picture. crafter and content batteries. updated requirements.
1 parent 74fab70 commit 937801b

9 files changed

+241
-16
lines changed

panpub/filters.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
import django_filters
5+
6+
from panpub.models import Crafter, Corpus, Content, Text
7+
8+
9+
class CrafterFilter(django_filters.FilterSet):
10+
class Meta:
11+
model = Crafter
12+
fields = ['user', ]
13+
14+
15+
class CorpusFilter(django_filters.FilterSet):
16+
class Meta:
17+
model = Corpus
18+
fields = ['name', 'license', 'datestamp']
19+
20+
21+
class ContentFilter(django_filters.FilterSet):
22+
class Meta:
23+
models = Content
24+
fields = ['name', 'license', 'datestamp',
25+
'claims', 'corpuses']
26+
27+
28+
class TextFilter(django_filters.FilterSet):
29+
class Meta:
30+
models = Text
31+
fields = ['name', 'license', 'datestamp',
32+
'claims', 'corpuses']

panpub/models.py

+98-4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ def get_absolute_url(self):
5151
def __str__(self):
5252
return self.name
5353

54+
def filefriendly_name(self):
55+
return slugify(self.name)
56+
5457
def only():
5558
contents = Content.objects.values_list('pk', flat=True)
5659
return Corpus.objects.exclude(pk__in=contents)
@@ -145,9 +148,6 @@ def save(self):
145148
else:
146149
super(Text, self).save()
147150

148-
def filefriendly_name(self):
149-
return slugify(self.name)
150-
151151
def available_pubformats(self):
152152
# pdf requires xetex
153153
return ('gfm',
@@ -179,8 +179,102 @@ def export(self, pubformat='markdown'):
179179
return datafile, filename, filelen
180180

181181

182+
class Dataset(Content):
183+
184+
tablib_formats = ('csv',
185+
'json',
186+
'xls',
187+
'yaml',
188+
'tsv',
189+
'html',
190+
'xlsx',
191+
'ods',
192+
'dbf',
193+
'df',
194+
)
195+
196+
document = models.FileField(
197+
upload_to='{}/datasets/'.format(PANPUB_MEDIA),
198+
)
199+
200+
def get_absolute_url(self):
201+
return reverse('Dataset_detail', args=[str(self.pk), ])
202+
203+
def save(self):
204+
pass
205+
206+
def available_pubformats(self):
207+
return tablib_formats+'latex' #TODO
208+
209+
def export(self, pubformat='csv'):
210+
pass
211+
212+
182213
class Picture(Content):
183-
document = models.FileField(upload_to='{}/pictures/'.format(PANPUB_MEDIA))
214+
215+
pillow_formats = ('bmp',
216+
'eps',
217+
'gif',
218+
'icns',
219+
'ico',
220+
'im',
221+
'jpeg',
222+
'jpeg2000',
223+
'msp',
224+
'pcx',
225+
'png',
226+
'ppm',
227+
'sgi',
228+
'spider',
229+
'tga',
230+
'tiff',
231+
'webp',
232+
'xbm',
233+
)
234+
235+
pillow_r_formats = ('blp',
236+
'cur',
237+
'dcx',
238+
'dds',
239+
'fli',
240+
'flc',
241+
'fpx',
242+
'ftex',
243+
'gbr',
244+
'gd',
245+
'imt',
246+
'iptc/naa',
247+
'mcidas',
248+
'mic',
249+
'mpo',
250+
'pcd',
251+
'pixar',
252+
'psd',
253+
'wal',
254+
'xpm',
255+
) + pillow_formats
256+
257+
pillow_w_formats = ('palm',
258+
'pdf',
259+
'xvthumbnail',
260+
) + pillow_formats
261+
262+
document = models.FileField(
263+
upload_to='{}/pictures/'.format(PANPUB_MEDIA),
264+
)
265+
266+
def get_absolute_url(self):
267+
return reverse('Picture_detail', args=[str(self.pk), ])
268+
269+
def save(self):
270+
pass
271+
272+
def available_pubformats(self):
273+
return pillow_w_formats
274+
275+
def export(self, pubformat='png'):
276+
pass
277+
184278

185279

186280
class Record(Content):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<h1>{{ content.name }}</h1>
2+
3+
<p>{{ content.description }} ({{ content.datestamp.created }})</p>
4+
5+
<p>{{ content.claims }}</p>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<ul>
2+
{% for content in contents %}
3+
<li>{{ content.name }}: {{ content.description }} ({{ content.datestamp.created }}) - {{ content.claims }}</li>
4+
{% empty %}
5+
<li>No content yet.</li>
6+
{% endfor %}
7+
</ul>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<h1>{{ crafter.user.username }}</h1>
2+
3+
<ul>
4+
{% for claim in crafter.claims %}
5+
<li>{{ claim }}</li>
6+
{% endfor %}
7+
</ul>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<ul>
2+
{% for crafter in crafters %}
3+
<li>{{ crafter.user.username }}: {{ crafter.claims }}</li>
4+
{% empty %}
5+
<li>No crafter yet.</li>
6+
{% endfor %}
7+
</ul>

panpub/urls.py

+57-11
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,110 @@
22
# -*- coding: utf-8 -*-
33
from django.conf.urls import url
44

5-
from panpub import views
5+
from django_filters.views import FilterView
6+
7+
from panpub import filters, views
68

79
urlpatterns = [
10+
url(
11+
regex="^crafter/(?P<pk>\d+)/$",
12+
view=views.CrafterDetail.as_view(),
13+
name='crafter_detail',
14+
),
15+
url(
16+
regex="^crafter/search/$",
17+
view=FilterView.as_view(filterset_class=filters.CrafterFilter),
18+
name='crafter_search',
19+
),
20+
url(
21+
regex="^crafter/$",
22+
view=views.CrafterList.as_view(),
23+
name='crafter_list',
24+
),
25+
826
url(
927
regex="^corpus/~create/$",
1028
view=views.CorpusCreate.as_view(),
11-
name='Corpus_create',
29+
name='corpus_create',
1230
),
1331
url(
1432
regex="^corpus/(?P<pk>\d+)/~delete/$",
1533
view=views.CorpusDelete.as_view(),
16-
name='Corpus_delete',
34+
name='corpus_delete',
1735
),
1836
url(
1937
regex="^corpus/(?P<pk>\d+)/$",
2038
view=views.CorpusDetail.as_view(),
21-
name='Corpus_detail',
39+
name='corpus_detail',
2240
),
2341
url(
2442
regex="^corpus/(?P<pk>\d+)/~update/$",
2543
view=views.CorpusUpdate.as_view(),
26-
name='Corpus_update',
44+
name='corpus_update',
45+
),
46+
url(
47+
regex="^corpus/search/$",
48+
view=FilterView.as_view(filterset_class=filters.CorpusFilter),
49+
name='corpus_search',
2750
),
2851
url(
2952
regex="^corpus/$",
3053
view=views.CorpusList.as_view(),
31-
name='Corpus_list',
54+
name='corpus_list',
3255
),
56+
57+
url(
58+
regex="^content/(?P<pk>\d+)/$",
59+
view=views.ContentDetail.as_view(),
60+
name='content_detail',
61+
),
62+
url(
63+
regex="^content/search/$",
64+
view=FilterView.as_view(filterset_class=filters.ContentFilter),
65+
name='content_search',
66+
),
67+
url(
68+
regex="^content/$",
69+
view=views.ContentList.as_view(),
70+
name='content_list',
71+
),
72+
3373
url(
3474
regex="^text/~create/$",
3575
view=views.TextCreate.as_view(),
36-
name='Text_create',
76+
name='text_create',
3777
),
3878
url(
3979
regex="^text/(?P<pk>\d+)/~delete/$",
4080
view=views.TextDelete.as_view(),
41-
name='Text_delete',
81+
name='text_delete',
4282
),
4383
url(
4484
regex="^text/(?P<pk>\d+)/$",
4585
view=views.TextDetail.as_view(),
46-
name='Text_detail',
86+
name='text_detail',
4787
),
4888
url(
4989
regex="^text/(?P<pk>\d+)/~update/$",
5090
view=views.TextUpdate.as_view(),
51-
name='Text_update',
91+
name='text_update',
5292
),
5393
url(
5494
regex="^text/(?P<text_id>\d+)/export/(?P<export_format>\w+)/$",
5595
view=views.text_export,
5696
name='text_export',
5797
),
98+
url(
99+
regex="^text/search/$",
100+
view=FilterView.as_view(filterset_class=filters.TextFilter),
101+
name='text_search',
102+
),
58103
url(
59104
regex="^text/$",
60105
view=views.TextList.as_view(),
61-
name='Text_list',
106+
name='text_list',
62107
),
108+
63109
url(
64110
regex="op/export/$",
65111
view=views.panpub_export,

panpub/views.py

+24
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,25 @@
1212
)
1313

1414
from panpub.models import (
15+
Crafter,
1516
Corpus,
17+
Content,
1618
Text,
1719
)
1820
from panpub import utils
1921

2022

23+
class CrafterList(ListView):
24+
model = Crafter
25+
context_object_name = 'crafters'
26+
paginate_by = 10
27+
28+
29+
class CrafterDetail(DetailView):
30+
model = Crafter
31+
context_object_name = 'crafter'
32+
33+
2134
class CorpusCreate(CreateView):
2235
model = Corpus
2336
fields = ['name', 'datestamp', 'description']
@@ -42,6 +55,17 @@ class CorpusList(ListView):
4255
paginate_by = 10
4356

4457

58+
class ContentList(ListView):
59+
model = Content
60+
context_object_name = 'contents'
61+
paginate_by = 10
62+
63+
64+
class ContentDetail(DetailView):
65+
model = Content
66+
context_object_name = 'content'
67+
68+
4569
class TextCreate(CreateView):
4670
model = Text
4771
fields = ['name', 'description', 'document', 'input_type']

requirements.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
pypandoc
1+
django-filter
22
django-markdown-deux
3+
pypandoc
4+
tablib[pandas]
5+
ujson

0 commit comments

Comments
 (0)