From 8cbcaefd6051029e67d2532c60780896dbf0b29f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Thu, 7 Aug 2014 12:22:54 +0200 Subject: [PATCH 01/16] Editor fixes --- apps/wiki/static/wiki/editor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wiki/static/wiki/editor b/apps/wiki/static/wiki/editor index 83edceff..a892115b 160000 --- a/apps/wiki/static/wiki/editor +++ b/apps/wiki/static/wiki/editor @@ -1 +1 @@ -Subproject commit 83edceffb18f5802bb6a9b20746437a3a46f2450 +Subproject commit a892115bc1f94bfd53873dd442854b5ebe3fd03c -- 2.20.1 From 72fcd14262e47075d7656c737d837c7a418f0d15 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Thu, 7 Aug 2014 12:24:08 +0200 Subject: [PATCH 02/16] Editor fix - fix jumping to a different document version --- apps/wiki/static/wiki/editor | 2 +- apps/wiki/templates/wiki/bootstrap.html | 7 +++++++ apps/wiki/views.py | 12 ++++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/wiki/static/wiki/editor b/apps/wiki/static/wiki/editor index a892115b..a6919c02 160000 --- a/apps/wiki/static/wiki/editor +++ b/apps/wiki/static/wiki/editor @@ -1 +1 @@ -Subproject commit a892115bc1f94bfd53873dd442854b5ebe3fd03c +Subproject commit a6919c029590f1b93e156264b063f2a9bbcff8dc diff --git a/apps/wiki/templates/wiki/bootstrap.html b/apps/wiki/templates/wiki/bootstrap.html index 73e47cac..cbf0232a 100644 --- a/apps/wiki/templates/wiki/bootstrap.html +++ b/apps/wiki/templates/wiki/bootstrap.html @@ -338,6 +338,13 @@ documentAttachmentUrl: function(attachmentName) { return '{{MEDIA_URL}}{{IMAGE_DIR}}{{slug}}/' + attachmentName; }, + documentUrl: function(id, version) { + var url = '{% url 'wiki_editor' slug %}' + if(version) { + url = url + '?version=' + version; + } + return url; + }, documentSaveForm: { fields: [ diff --git a/apps/wiki/views.py b/apps/wiki/views.py index d7763025..7ecec635 100644 --- a/apps/wiki/views.py +++ b/apps/wiki/views.py @@ -83,13 +83,21 @@ def editor(request, slug, chunk=None, template_name='wiki/bootstrap.html'): request.session['wiki_last_books'] = last_books save_form = forms.DocumentTextSaveForm(user=request.user, prefix="textsave") + try: + version = int(request.GET.get('version', None)) + except: + version = None + if version: + text = chunk.at_revision(version).materialize() + else: + text = chunk.materialize() return render(request, template_name, { 'serialized_document_data': simplejson.dumps({ - 'document': chunk.materialize(), + 'document': text, 'document_id': chunk.id, 'title': chunk.book.title, 'history': get_history(chunk), - 'version': chunk.revision(), + 'version': version or chunk.revision(), 'stage': chunk.stage.name if chunk.stage else None, 'assignment': chunk.user.username if chunk.user else None }), -- 2.20.1 From 96e548aa69f3c56867351cce682cba6462f65225 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Thu, 14 Aug 2014 16:28:16 +0200 Subject: [PATCH 03/16] Editor update --- apps/wiki/static/wiki/editor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wiki/static/wiki/editor b/apps/wiki/static/wiki/editor index a6919c02..c8101069 160000 --- a/apps/wiki/static/wiki/editor +++ b/apps/wiki/static/wiki/editor @@ -1 +1 @@ -Subproject commit a6919c029590f1b93e156264b063f2a9bbcff8dc +Subproject commit c8101069e6de3c7eeb44e97e391c9fa4b9db0872 -- 2.20.1 From d95ee90d7f346871a256172bd65e274056a3635d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Thu, 14 Aug 2014 16:29:00 +0200 Subject: [PATCH 04/16] Editor update - edumed exercises --- apps/wiki/locale/pl/LC_MESSAGES/djangojs.mo | Bin 6379 -> 7660 bytes apps/wiki/locale/pl/LC_MESSAGES/djangojs.po | 75 ++++++++++++++++++++ apps/wiki/static/wiki/editor | 2 +- apps/wiki/templates/wiki/bootstrap.html | 8 +++ 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/apps/wiki/locale/pl/LC_MESSAGES/djangojs.mo b/apps/wiki/locale/pl/LC_MESSAGES/djangojs.mo index 9a81bcc9b106dc0bccb908c1d5b7d6d0bd1a78a3..45254a34c051af035747a364ae57b5d1ea2bf3d1 100644 GIT binary patch delta 3552 zcmY+_eQaHI9mnxs_u$r+?xDTyO2^i-=Z&$=Zd4{ihLnwsv9;{MNv)%2_nx(mB37fuSzuIP4sV;)6fXFqe|V6>L`OMd4LW+ zhAQK1xaV-G5kBk8H*piz@y%%wb)iPM3stEB)Lf6C5((`26R6*Vub>kC zA@W&P%}X?t*+tYMyn;&TUr3T>0lloj6}T4npw5T50#Biye;)PROQ=Qq1}d>Xqo(u& z)W8;SlU#&z^!+cjCstcGAk%AZMNPpDRB7)+m9!t@N})c-tiApOssd+FYvDQT6e_{D zQSZBq{Fx8fIr{#aSP`AL5q0A})FK&VN7AN@>iFxZ>!(o(K98!zS=4>6+T(XnmHIcT z63fX(&u>H>-)8N>s!G&LBOVcIZnCHhA3=>MLUr^V)C+!uO5j(hxjv7Y>kFv&TtdC~ zed`SBuadW+D!BxiU9+Ks`fF}_*y%exV$GmBJb_B+Nj!jOP#s-Hz34+!hYkGj%T^pf z2lbo(1$6Lf)PT;R61jk?$eAY6YB_lIiDf4ZKx3s$Tm%NfYxC`qfsK-_7M*e_Y(S7thv;dB0e6s zYC8uWCX|4ZXS&Uu#C}4X)(8bMTL>ksElaE?w5~p{Vuv)6#7;tUs_iynE3r}sY=>&Z z`+nOlqE@+n1GITH;^|bgi|8d(_RkSos9Hk@32ie7Uz4pBt&IxCrM?3{MeHK94c9P( z7!X>hpCmNj+A1~TU&o`gwQ!HwbA32w+n>N4M1i=S(88Xj#kPsKpU}3Q_%z`XCE{k{ zRzho`OnjEuM%+b=656_Jn7eV6ZC|C+HuzBDg?bzxATsv+gZJ3REmp01ZRr~3LDY}O z)onA45n>~u1vo_Hh`q!SB2Q?$FY2EAdV}W_a_M5|=d#hv`jxX?XUNS*o%P2PULhIy zd0lXZa$dn1_5v^ZT775qRDB{5c$wV8o)ZrH1;-onf}~&YqG#&|t4`qM({9ppGHx(x zcBK5!3B56PxocNSemERo$pvOd5NL1TK*JBsPB&ff%uYWjgpMD28FR0jFPL3^%5#PS zKSiq$=7O@>o%KWCO=H0eLT6RMagRma4a?_VOQ^Tu*Yil@y3V7P#&z@d7So}hPkTK_sPUW&|LMN4T+-#XaWrvnUeT{1u^#&;~F#Ek!j$J(BT76D54sQOxf!eDY zYVA&5ajh_%iE9#FZ2V#?7q0f~nFF@;lLI&0Sl4_oD0)UaCl@$z6{4`|^5o#W{LGgA zjPFf<$q90ml0P+GakIV`y}EE&(}A$`%4AS+(#6rK)6w4+o@zc=bV_-@P;v6Pw3qaB zW3hSNnx0D8$+}M7D`j&|ayaR6N3l@MPK{5UQh_RNDt_si=0d7C!eJqt8qfQBp2;eQ zoD02CrX;>{I$s=_8c&wvOU&Ti(MT65_7mblA8WGGdX>-P%(YJ7nBP0@1?zr zmkrJR#Zf=%Z0TrV3X>ylS~+fQ>7H{nhhr_jZ|kjO-DE{ma$PEJ)ScMSe7Jm+F*_yS zOXo&|T$n9KZemFj?{avP6TC8cbXhc(xY;?B&jl6o8ZC~PzFa9(rOcs1kwVt$^<2X1 zy6*L!y%-Nv?UG7jOXD)SxF%7e^_fna!-$v4+8oUO>*i+ir>%F^wf6;XDdn0Pba~V{ R7FT5QA8l*vqW1RJ{s+{Z91#Ej delta 2327 zcmXxl4@}f$9LMp802A*x^x}Y1PR>C7Nh+3q2$Y~OO)35rYJj3p0WlU_iL|=)$3|^V z*E3sYwQ99x)Y4d^zgA0UmQ5Ggaw}JBvoUg7ty(jy_vh~M*?sTzJU^b_^E|)r^Zbrq z$|p;sr~OI04W*sPCh`)Ec?3(Q@I_fR)fhjP;dES!$=HhOvIRrfjrll?nfNBo#Uq%3 zXE7C%QsVdf@p5CLCX32!{t!kFR^m)tgI>G?HPHa3;}Fimoj3zW@Jjp;efR@voO8&> zT;NOhCr^t{?8PM7eoSG0lSze@m^rAG7oi5KLS>{5wV+;9CWcW1>_uhd1q|Z>R3^T1 z*UzK+C$JhG-lU^45JKHI57U|7R8Uds>QMs^Vj4c++<|<|bIyHu1?{(8`>69I>Op>V zPN2s56=Mq_ofY>#EtkFW?>M#$-nmWZ!QGU$LQ)Pc%+1Gb|k973{d9z`u|Cu*Fh zP!o)}>-$luA9L-G-QSNOYcTP%zd1iAWN=18i8nu8ksMqE^YK0l3L#I0zxnx$N zUcYsy1+-xS-iLh5^L*vv0aX8!sD3{q$H4rDTBwJ#%BbH}f~ZV{Q5jf>I?ZM7dNXQ^ z?sPtcnqV&~sY84a$6?B39$6@jBvKLW^r9))P82w-XHn>x>nhC;gAnD_BkFA$7Q8^Vh^G z@x$Y)W;K;XM6Qc-q^lt zPd5=a68eXua$6j86W&6EU0Wxeu;zaf=`wo_Zl5s8&jXFY1~SGcwgZa#78 z;bWKe8s-pJ6E_q5R>VrJQ|RQX=zuOJt|8{ynrUC#BF}8wVq;oK0i_;z){U|Ln!A?v+ zH~QU-yAy3oAZ(uqJZ5t<3T-6go+8GpKK$^Z?H#6hTX)Cd_e|rKyZW}acZUbM+9N%O z_Lx;&1ChS|u6Em-x!CT{JZg7kmDuB1+4kS8ys344TO*&2_7B Date: Wed, 23 Mar 2016 12:50:25 +0100 Subject: [PATCH 05/16] https repository in requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d81e4d41..263d4196 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ --i http://pypi.nowoczesnapolska.org.pl/simple +-i https://py.mdrn.pl:8443/simple ## Python libraries lxml>=2.2.2 -- 2.20.1 From ca53213de2da260a5df5cc8c082876be95937376 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Wed, 23 Mar 2016 12:51:08 +0100 Subject: [PATCH 06/16] PyCharm in .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 156648d6..920f51fa 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,9 @@ nbproject/* .pydevproject .settings +# PyCharm +.idea + node_modules /static_test -- 2.20.1 From 7c044c0839d47a0368ec63d9e2bf9962984944d7 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Wed, 23 Mar 2016 13:24:12 +0100 Subject: [PATCH 07/16] local changes from server --- apps/catalogue/templates/catalogue/base.html | 1 + apps/wiki/views.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/catalogue/templates/catalogue/base.html b/apps/catalogue/templates/catalogue/base.html index 62345762..b623be06 100644 --- a/apps/catalogue/templates/catalogue/base.html +++ b/apps/catalogue/templates/catalogue/base.html @@ -9,6 +9,7 @@ {% block add_css %}{% endblock %} +
diff --git a/apps/wiki/views.py b/apps/wiki/views.py index 7ecec635..d68a3512 100644 --- a/apps/wiki/views.py +++ b/apps/wiki/views.py @@ -52,7 +52,7 @@ def get_history(chunk): @never_cache -@login_required +# @login_required def editor(request, slug, chunk=None, template_name='wiki/bootstrap.html'): try: chunk = Chunk.get(slug, chunk) -- 2.20.1 From b216a484808c491e379f6a5986f94251fee661f3 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Wed, 23 Mar 2016 16:45:26 +0100 Subject: [PATCH 08/16] code style --- apps/catalogue/models/book.py | 44 ++++++++++++----------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/apps/catalogue/models/book.py b/apps/catalogue/models/book.py index f07c9a83..38d84996 100755 --- a/apps/catalogue/models/book.py +++ b/apps/catalogue/models/book.py @@ -7,10 +7,8 @@ from django.contrib.sites.models import Site from django.db import models, transaction from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ -from django.conf import settings from slughifi import slughifi - import apiclient from catalogue.helpers import cached_in_field, GalleryMerger from catalogue.models import BookPublishRecord, ChunkPublishRecord, Project @@ -18,9 +16,7 @@ from catalogue.signals import post_publish from catalogue.tasks import refresh_instance, book_content_updated from catalogue.xml_tools import compile_text, split_xml from cover.models import Image -import os -import shutil -import re + class Book(models.Model): """ A document edited on the wiki """ @@ -31,8 +27,9 @@ class Book(models.Model): gallery = models.CharField(u'materiały', max_length=255, blank=True) project = models.ForeignKey(Project, null=True, blank=True) - #wl_slug = models.CharField(_('title'), max_length=255, null=True, db_index=True, editable=False) - parent = models.ForeignKey('self', null=True, blank=True, verbose_name=_('parent'), related_name="children", editable=False) + # wl_slug = models.CharField(_('title'), max_length=255, null=True, db_index=True, editable=False) + parent = models.ForeignKey( + 'self', null=True, blank=True, verbose_name=_('parent'), related_name="children", editable=False) parent_number = models.IntegerField(_('parent number'), null=True, blank=True, db_index=True, editable=False) # Cache @@ -41,10 +38,9 @@ class Book(models.Model): _new_publishable = models.NullBooleanField(editable=False) _published = models.NullBooleanField(editable=False) _on_track = models.IntegerField(null=True, blank=True, db_index=True, editable=False) - dc_cover_image = models.ForeignKey(Image, blank=True, null=True, - db_index=True, on_delete=models.SET_NULL, editable=False) - dc_slug = models.CharField(max_length=128, null=True, blank=True, - editable=False, db_index=True) + dc_cover_image = models.ForeignKey( + Image, blank=True, null=True, db_index=True, on_delete=models.SET_NULL, editable=False) + dc_slug = models.CharField(max_length=128, null=True, blank=True, editable=False, db_index=True) class NoTextError(BaseException): pass @@ -55,7 +51,6 @@ class Book(models.Model): verbose_name = u'moduł' verbose_name_plural = u'moduły' - # Representing # ============ @@ -79,7 +74,7 @@ class Book(models.Model): @models.permalink def get_absolute_url(self): - return ("catalogue_book", [self.slug]) + return "catalogue_book", [self.slug] def correct_about(self): return "http://%s%s" % ( @@ -95,8 +90,8 @@ class Book(models.Model): @classmethod @transaction.commit_on_success - def create(cls, creator, text, *args, **kwargs): - b = cls.objects.create(*args, **kwargs) + def create(cls, creator, text, **kwargs): + b = cls.objects.create(**kwargs) b.chunk_set.all().update(creator=creator) b[0].commit(text, author=creator) return b @@ -107,8 +102,7 @@ class Book(models.Model): @classmethod @transaction.commit_on_success - def import_xml_text(cls, text=u'', previous_book=None, - commit_args=None, **kwargs): + def import_xml_text(cls, text=u'', previous_book=None, commit_args=None, **kwargs): """Imports a book from XML, splitting it into chunks as necessary.""" texts = split_xml(text) if previous_book: @@ -122,7 +116,6 @@ class Book(models.Model): for i in range(book_len - len(texts)): texts.append((u'pusta część %d' % (i + 1), u'')) - i = 0 for i, (title, text) in enumerate(texts): if not title: title = u'część %d' % (i + 1) @@ -212,7 +205,6 @@ class Book(models.Model): other.delete() - @transaction.commit_on_success def prepend_history(self, other): """Prepend history from all the other book's chunks to own.""" @@ -231,10 +223,8 @@ class Book(models.Model): def split(self): """Splits all the chunks into separate books.""" - self.title for chunk in self: - book = Book.objects.create(title=chunk.title, slug=chunk.slug, - public=self.public, gallery=self.gallery) + book = Book.objects.create(title=chunk.title, slug=chunk.slug, public=self.public, gallery=self.gallery) book[0].delete() chunk.book = book chunk.number = 1 @@ -277,8 +267,6 @@ class Book(models.Model): return self.assert_publishable() except AssertionError, e: return e - else: - return None def hidden(self): return self.slug.startswith('.') @@ -309,8 +297,7 @@ class Book(models.Model): def get_on_track(self): if self.published: return -1 - stages = [ch.stage.ordering if ch.stage is not None else 0 - for ch in self] + stages = [ch.stage.ordering if ch.stage is not None else 0 for ch in self] if not len(stages): return 0 return min(stages) @@ -349,7 +336,7 @@ class Book(models.Model): if info.cover_source: try: image = Image.objects.get(pk=int(info.cover_source.rstrip('/').rsplit('/', 1)[-1])) - except: + except Image.DoesNotExist: pass else: if info.cover_source == image.get_full_url(): @@ -405,8 +392,7 @@ class Book(models.Model): changes = self.get_current_changes(publishable) return compile_text(change.materialize() for change in changes) - def wldocument(self, publishable=True, changes=None, - parse_dublincore=True, strict=False): + def wldocument(self, publishable=True, changes=None, parse_dublincore=True, strict=False): from catalogue.ebook_utils import RedakcjaDocProvider from librarian.parser import WLDocument -- 2.20.1 From 6334c366b3cb820e6997eea51b14bdc30591ce45 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Wed, 23 Mar 2016 16:57:43 +0100 Subject: [PATCH 09/16] https repository in requirements-dev --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 5e655130..d0abc39c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ --i http://pypi.nowoczesnapolska.org.pl/simple +-i https://py.mdrn.pl:8443/simple fabric fnpdjango>=0.1.10,<0.2 -- 2.20.1 From 814264a85573e5fc9274872a255d32e0be608bbd Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Thu, 24 Mar 2016 16:39:17 +0100 Subject: [PATCH 10/16] field for cybernauts --- .../catalogue/locale/pl/LC_MESSAGES/django.mo | Bin 6080 -> 6096 bytes .../catalogue/locale/pl/LC_MESSAGES/django.po | 59 +++---- ...014_auto__add_field_book_for_cybernauts.py | 157 ++++++++++++++++++ apps/catalogue/models/book.py | 2 + apps/wiki/forms.py | 11 +- apps/wiki/locale/pl/LC_MESSAGES/django.mo | Bin 4071 -> 4216 bytes apps/wiki/locale/pl/LC_MESSAGES/django.po | 71 ++++---- apps/wiki/locale/pl/LC_MESSAGES/djangojs.mo | Bin 7660 -> 7659 bytes apps/wiki/locale/pl/LC_MESSAGES/djangojs.po | 2 +- apps/wiki/templates/wiki/bootstrap.html | 23 ++- .../wiki/templates/wiki/document_details.html | 49 ------ apps/wiki/templates/wiki/save_dialog.html | 59 ------- apps/wiki/views.py | 6 +- 13 files changed, 262 insertions(+), 177 deletions(-) create mode 100644 apps/catalogue/migrations/0014_auto__add_field_book_for_cybernauts.py delete mode 100644 apps/wiki/templates/wiki/document_details.html delete mode 100644 apps/wiki/templates/wiki/save_dialog.html diff --git a/apps/catalogue/locale/pl/LC_MESSAGES/django.mo b/apps/catalogue/locale/pl/LC_MESSAGES/django.mo index 0187fa8630883a1aa563254d93567bffe8ec27b2..fc65919a0634e3c665c15c2090a6c36144c12669 100644 GIT binary patch delta 1137 zcmYMzOGs346vy%Zm1b@}M#mnSO_pJVWa5k?4aAht!!jR>48rI&VkHp!%t$!B z`k*la>j_M{#J3pXeh!(*{6r08ij66UJXC%a?!Y9j#S|*OpC&#tdqZXQ($Z zt%V{k-lGb?pc*dXPAphwOasPI4f{|HZsI1qjhpc?a+nvK^pkzWZMf*}eWukEutMK$_{L-@zVhX`r|87#vG$R5m7)J~^R_3u!F z&LMr%W{Hcf1Xi#P%NSn|Y(W*A!2;~YMjXH-K1aRsUv538WHqk{Im{MLESWeeuL(8a zanwdnV}$3MK`u0*bqT|$f+wh*jH3$PxcI#DJL+RvMh(1z+HrpAYP=lv(N?0~WEJXP zmT>D080;c&mrDtreANP*geSW*wX7BnDuf>l0rGcZ=G}{^OJF*LYPr!DBP843e z+FNn(dgq1Sp432ppB)P=hxgP(<27~l6|vafXnl1wmYpd4b%D=Q+@8@iBMw7HbrO;C{| zM2|%v5iN}3mJk+Lc)=DzPz1FQBP4+T|ljdIGwap#1Kr%~%(qw?Q5XCs#QpZLiI z<}sHAe=rBL^Ub1IfZDhMwb2GQ-|XfwRNi(M--me_W-VAr{3x5~`UO<}W#p0#M-vM- z8X-_fVAL&qj%CcJky`9Cs-T~^61}Ah>&tO1^B87h2Ws7MT#Rwljm}~fCQ*evL_LXT z2?k3TOrjFspf;Srb-1X&Y!_CdHta=ha0W~9Jg&eS$YGB;=~Yc(InKEGU(~BCqD$p( zMCB*y8K~1X)JDBngGp57V@T7MMiuZDwb2J0#2+qxj-VPy;&Qx#^kDZ;osOgOUm&&E zG_r5PW*Mv^@D1xQO8L6s9#q0%%)>5h#M9V-DbyqX>aPEC`o(4(R>+BvRif7IMitnM zYP228xWDze3l~w94!ikHRN@^}NB2>QQ!f6|`33b+&7(U0?dFk^g^#un^(0GCf7g1{ z`fBt~GN@;u#0FG_ZK#i~1J(H{Q~?91zu=N{$axJ__$}0v8$rF}N9bWwxW=#YTEbR; ztJfAL{Vs2RIOkV*jbTm@^A3bNgLbboyc(2wt>I`;lGRMk!SE$>OU(s+S(zvL`{UuE w$dPa?@;$m`Qw>M$>e|{Jb=#_H>QYbg-v>GIfu6}^`f0o;94hV(b4$|y0E&@%#{d8T diff --git a/apps/catalogue/locale/pl/LC_MESSAGES/django.po b/apps/catalogue/locale/pl/LC_MESSAGES/django.po index 5f5148e3..0b0b51c8 100644 --- a/apps/catalogue/locale/pl/LC_MESSAGES/django.po +++ b/apps/catalogue/locale/pl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Platforma Redakcyjna\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-04-01 11:28+0200\n" +"POT-Creation-Date: 2016-03-24 11:04+0100\n" "PO-Revision-Date: 2014-04-01 11:29+0100\n" "Last-Translator: Radek Czajka \n" "Language-Team: Fundacja Nowoczesna Polska =20) ? 1 : 2);\n" "X-Generator: Poedit 1.5.4\n" -#: forms.py:38 +#: forms.py:39 msgid "You must select a template" msgstr "Musisz wybrać szablon" -#: forms.py:47 +#: forms.py:48 msgid "ZIP file" msgstr "Plik ZIP" -#: forms.py:48 +#: forms.py:49 msgid "Directories are documents in chunks" msgstr "Katalogi zawierają dokumenty w częściach" -#: forms.py:72 +#: forms.py:73 msgid "Assigned to" msgstr "Przypisane do" -#: forms.py:93 forms.py:107 +#: forms.py:94 forms.py:108 msgid "Chunk with this slug already exists" msgstr "Część z tym slugiem już istnieje" -#: forms.py:116 +#: forms.py:117 msgid "Append to" msgstr "Dołącz do" -#: views.py:161 +#: views.py:160 #, python-format msgid "Slug already used for %s" msgstr "Slug taki sam jak dla pliku %s" -#: views.py:163 +#: views.py:162 msgid "Slug already used in repository." msgstr "Dokument o tym slugu już istnieje w repozytorium." -#: views.py:169 +#: views.py:168 msgid "File should be UTF-8 encoded." msgstr "Plik powinien mieć kodowanie UTF-8." -#: models/book.py:28 models/chunk.py:23 +#: models/book.py:24 models/chunk.py:23 msgid "title" msgstr "tytuł" -#: models/book.py:29 models/chunk.py:24 +#: models/book.py:25 models/chunk.py:24 msgid "slug" msgstr "slug" -#: models/book.py:30 +#: models/book.py:26 msgid "public" msgstr "publiczna" -#: models/book.py:35 +#: models/book.py:32 msgid "parent" msgstr "rodzic" -#: models/book.py:36 +#: models/book.py:33 msgid "parent number" msgstr "numeracja rodzica" -#: models/book.py:55 models/chunk.py:21 models/publish_log.py:17 -msgid "book" -msgstr "książka" - -#: models/book.py:56 -msgid "books" -msgstr "książki" +#: models/book.py:35 +msgid "for Cybernauts" +msgstr "dla Cybernautów" -#: models/book.py:255 +#: models/book.py:247 msgid "No chunks in the book." msgstr "Książka nie ma części." -#: models/book.py:259 +#: models/book.py:251 msgid "Not all chunks have publishable revisions." msgstr "Niektóre części nie są gotowe do publikacji." -#: models/book.py:266 +#: models/book.py:258 msgid "Invalid XML" msgstr "Nieprawidłowy XML" -#: models/book.py:268 +#: models/book.py:260 msgid "No Dublin Core found." msgstr "Brak sekcji Dublin Core." -#: models/book.py:270 +#: models/book.py:262 msgid "Invalid Dublin Core" msgstr "Nieprawidłowy Dublin Core" -#: models/book.py:273 +#: models/book.py:265 msgid "rdf:about is not" msgstr "rdf:about jest różny od" +#: models/chunk.py:21 models/publish_log.py:17 +msgid "book" +msgstr "książka" + #: models/chunk.py:22 msgid "number" msgstr "numer" @@ -418,6 +418,9 @@ msgstr "Zmiana" msgid "Comment" msgstr "Komentarz" +#~ msgid "books" +#~ msgstr "książki" + #~ msgid "Text file must be UTF-8 encoded." #~ msgstr "Plik powinien mieć kodowanie UTF-8." diff --git a/apps/catalogue/migrations/0014_auto__add_field_book_for_cybernauts.py b/apps/catalogue/migrations/0014_auto__add_field_book_for_cybernauts.py new file mode 100644 index 00000000..061b9412 --- /dev/null +++ b/apps/catalogue/migrations/0014_auto__add_field_book_for_cybernauts.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Book.for_cybernauts' + db.add_column(u'catalogue_book', 'for_cybernauts', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Book.for_cybernauts' + db.delete_column(u'catalogue_book', 'for_cybernauts') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'ordering': "['title', 'slug']", 'object_name': 'Book'}, + '_new_publishable': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + '_on_track': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + '_published': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + '_short_html': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + '_single': ('django.db.models.fields.NullBooleanField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'dc_cover_image': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['cover.Image']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'dc_slug': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'for_cybernauts': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'gallery': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Project']", 'null': 'True', 'blank': 'True'}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}) + }, + 'catalogue.bookpublishrecord': { + 'Meta': {'ordering': "['-timestamp']", 'object_name': 'BookPublishRecord'}, + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'publish_log'", 'to': "orm['catalogue.Book']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + 'catalogue.chunk': { + 'Meta': {'ordering': "['number']", 'unique_together': "[['book', 'number'], ['book', 'slug']]", 'object_name': 'Chunk'}, + '_changed': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + '_hidden': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + '_short_html': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'created_chunk'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'gallery_start': ('django.db.models.fields.IntegerField', [], {'default': '1', 'null': 'True', 'blank': 'True'}), + 'head': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['catalogue.ChunkChange']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'number': ('django.db.models.fields.IntegerField', [], {}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ChunkTag']", 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'catalogue.chunkchange': { + 'Meta': {'ordering': "('created_at',)", 'unique_together': "(['tree', 'revision'],)", 'object_name': 'ChunkChange'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'author_email': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'author_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}), + 'data': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'merge_parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'merge_children'", 'null': 'True', 'blank': 'True', 'to': "orm['catalogue.ChunkChange']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'children'", 'null': 'True', 'blank': 'True', 'to': "orm['catalogue.ChunkChange']"}), + 'publishable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'revision': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'change_set'", 'symmetrical': 'False', 'to': "orm['catalogue.ChunkTag']"}), + 'tree': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'change_set'", 'to': "orm['catalogue.Chunk']"}) + }, + 'catalogue.chunkpublishrecord': { + 'Meta': {'object_name': 'ChunkPublishRecord'}, + 'book_record': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.BookPublishRecord']"}), + 'change': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'publish_log'", 'to': "orm['catalogue.ChunkChange']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'catalogue.chunktag': { + 'Meta': {'ordering': "['ordering']", 'object_name': 'ChunkTag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'ordering': ('django.db.models.fields.IntegerField', [], {}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}) + }, + 'catalogue.project': { + 'Meta': {'ordering': "['name']", 'object_name': 'Project'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + 'catalogue.template': { + 'Meta': {'object_name': 'Template'}, + 'content': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_main': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_partial': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'cover.image': { + 'Meta': {'object_name': 'Image'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'download_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'unique': 'True', 'null': 'True'}), + 'file': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'license_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'license_url': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'}), + 'source_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + } + } + + complete_apps = ['catalogue'] \ No newline at end of file diff --git a/apps/catalogue/models/book.py b/apps/catalogue/models/book.py index 38d84996..f40a368f 100755 --- a/apps/catalogue/models/book.py +++ b/apps/catalogue/models/book.py @@ -32,6 +32,8 @@ class Book(models.Model): 'self', null=True, blank=True, verbose_name=_('parent'), related_name="children", editable=False) parent_number = models.IntegerField(_('parent number'), null=True, blank=True, db_index=True, editable=False) + for_cybernauts = models.BooleanField(_('for Cybernauts'), default=False) + # Cache _short_html = models.TextField(null=True, blank=True, editable=False) _single = models.NullBooleanField(editable=False, db_index=True) diff --git a/apps/wiki/forms.py b/apps/wiki/forms.py index 137b072f..c7da3aff 100644 --- a/apps/wiki/forms.py +++ b/apps/wiki/forms.py @@ -64,13 +64,20 @@ class DocumentTextSaveForm(forms.Form): help_text=_(u"Mark this revision as publishable.") ) + for_cybernauts = forms.BooleanField( + required=False, initial=False, + label=_(u"For Cybernauts"), + help_text=_(u"Mark this document for Cybernauts.") + ) + def __init__(self, *args, **kwargs): user = kwargs.pop('user') - r = super(DocumentTextSaveForm, self).__init__(*args, **kwargs) + chunk = kwargs.pop('chunk') + super(DocumentTextSaveForm, self).__init__(*args, **kwargs) if user and user.is_authenticated(): self.fields['author_name'].required = False self.fields['author_email'].required = False - return r + self.fields['for_cybernauts'].initial = chunk.book.for_cybernauts class DocumentTextRevertForm(forms.Form): diff --git a/apps/wiki/locale/pl/LC_MESSAGES/django.mo b/apps/wiki/locale/pl/LC_MESSAGES/django.mo index 3690ba50029a591415039c6f036835d70d393bda..e5c3cac87845f4aa496f004faa8cbd4b1b092306 100644 GIT binary patch delta 1707 zcmY+^TS!zv9LMol^HQ#xwq3L=JzXtJ*Hycj+Ql1@6oD^2B%E9;*xC)-#e`rff?g7e zEs6?)qI&3|%Tg3n1ma5+RM0~gf`|$ssE42n8GV1dBh_&J^O@N*=gj}ijD9Tt?j+v$ zvriaG2QicA$}+~qBiU4xqFiIVI0^G{7IK+|R1+~^`^~oBhST`H3rjJKMR*t|;3+J` z^EktpgtSUw6@)gSifAP2h~-2% zQA6mAYj;-?O9_=FgihExLPvNRp~5n!H*U2$Ya@|p%uRmF`QVH8IV}U*dix@7JhnIa zDtELb6zz%c?v2Ep?f>1YPCd?xW%-s>)znqh);q!4hF~zcF@Gq((~aziyE}RtoK%sw z$5Yh0%l-Sxp;UjWufXG(6N-j2Zw*DA`0(9`aDz`#r6x&%W=TKVk%= AD*ylh delta 1578 zcmYk+O-NKx7{>84=EvyhjG1PojgvK6Q#yW3S=xt|BIPQG+7(JA!k`OC9w93-|QCs{6Lzqn#x?hL7-(WqCO5h}B;aO`GE9m!P zj4\n" "Language-Team: Fundacja Nowoczesna Polska \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" -#: forms.py:19 forms.py:63 views.py:279 +#: forms.py:19 forms.py:63 views.py:45 msgid "Publishable" -msgstr "Gotowe do publikacji" +msgstr "Do publikacji" -#: forms.py:38 forms.py:89 +#: forms.py:38 forms.py:96 msgid "Author" msgstr "Autor" -#: forms.py:39 forms.py:90 +#: forms.py:39 forms.py:97 msgid "Your name" msgstr "Imię i nazwisko" -#: forms.py:44 forms.py:95 +#: forms.py:44 forms.py:102 msgid "Author's email" msgstr "E-mail autora" -#: forms.py:45 forms.py:96 +#: forms.py:45 forms.py:103 msgid "Your email address, so we can show a gravatar :)" msgstr "Adres e-mail, żebyśmy mogli pokazać gravatar :)" -#: forms.py:51 forms.py:102 +#: forms.py:51 forms.py:109 msgid "Your comments" msgstr "Twój komentarz" @@ -57,7 +58,15 @@ msgstr "Jeśli został ukończony etap prac, wskaż go." msgid "Mark this revision as publishable." msgstr "Oznacz tę wersję jako gotową do publikacji." -#: forms.py:103 +#: forms.py:69 +msgid "For Cybernauts" +msgstr "Dla Cybernautów" + +#: forms.py:70 +msgid "Mark this document for Cybernauts." +msgstr "Oznacz dokument do użytku w Cybernautach" + +#: forms.py:110 msgid "Describe the reason for reverting." msgstr "Opisz powód przywrócenia." @@ -73,15 +82,15 @@ msgstr "motyw" msgid "themes" msgstr "motywy" -#: views.py:281 +#: views.py:47 msgid "Published" msgstr "Opublikowano" -#: views.py:302 +#: views.py:329 msgid "Revision marked" msgstr "Wersja oznaczona" -#: views.py:304 +#: views.py:331 msgid "Nothing changed" msgstr "Nic nie uległo zmianie" @@ -89,6 +98,23 @@ msgstr "Nic nie uległo zmianie" msgid "Table for Redmine wiki" msgstr "Tabela do wiki na Redmine" +#: templates/wiki/bootstrap.html:69 +msgid "Informations about lesson" +msgstr "Informacje o lekcji" + +#: templates/wiki/bootstrap.html:71 +#: templates/wiki/document_details_base.html:35 +msgid "Version" +msgstr "Wersja" + +#: templates/wiki/bootstrap.html:72 +msgid "Stage" +msgstr "Etap" + +#: templates/wiki/bootstrap.html:73 +msgid "Assignment" +msgstr "Przypisano" + #: templates/wiki/diff_table.html:5 msgid "Old version" msgstr "Stara wersja" @@ -105,10 +131,6 @@ msgstr "Kliknij, aby (ro)zwinąć galerię" msgid "Help" msgstr "Pomoc" -#: templates/wiki/document_details_base.html:35 -msgid "Version" -msgstr "Wersja" - #: templates/wiki/document_details_base.html:35 msgid "Unknown" msgstr "nieznana" @@ -203,14 +225,15 @@ msgstr "Zamień" msgid "Replace all" msgstr "Zamień wszystko" +#: templates/wiki/tabs/search_view.html:15 msgid "Options" msgstr "Opcje" -#: templates/wiki/tabs/search_view.html:15 +#: templates/wiki/tabs/search_view.html:17 msgid "Case sensitive" msgstr "Rozróżniaj wielkość liter" -#: templates/wiki/tabs/search_view.html:17 +#: templates/wiki/tabs/search_view.html:19 msgid "From cursor" msgstr "Zacznij od kursora" @@ -278,18 +301,6 @@ msgstr "Wstaw przypis" msgid "Visual editor" msgstr "Edytor wizualny" -#: templates/wiki/bootstrap.html:95 -msgid "Informations about lesson" -msgstr "Informacje o lekcji" - -#: templates/wiki/bootstrap.html:97 -msgid "Stage" -msgstr "Etap" - -#: templates/wiki/bootstrap.html:98 -msgid "Assignment" -msgstr "Przypisano" - #~ msgid "ZIP file" #~ msgstr "Plik ZIP" diff --git a/apps/wiki/locale/pl/LC_MESSAGES/djangojs.mo b/apps/wiki/locale/pl/LC_MESSAGES/djangojs.mo index 45254a34c051af035747a364ae57b5d1ea2bf3d1..b078536bf276f98e5b6c09570454dadd3f1624aa 100644 GIT binary patch delta 153 zcmaE3{n~ni4ST%;0|SGUECT}@khTWWTtM0h%J&7*58U_k1W2!e${z&MAoI@vX;vV88AuBP>6@|)n|HI9i*lr9DP-ptWM)pb HmfZ*dSW*=v delta 154 zcmaED{l1jY(1W2!i${zyKAoI@xX;vV81xO15>07c4n|HI9i*g=mRmjdS$UHK0 IvX$&c0DL_bq5uE@ diff --git a/apps/wiki/locale/pl/LC_MESSAGES/djangojs.po b/apps/wiki/locale/pl/LC_MESSAGES/djangojs.po index 16d331db..0c91bc4b 100644 --- a/apps/wiki/locale/pl/LC_MESSAGES/djangojs.po +++ b/apps/wiki/locale/pl/LC_MESSAGES/djangojs.po @@ -148,7 +148,7 @@ msgstr "" #: static/wiki/editor/src/editor/modules/data/data.js:139 msgid "Yes, restore local draft" -msgstr "Tak, chcę użyć lokalną kopię" +msgstr "Tak, chcę użyć lokalnej kopii" #: static/wiki/editor/src/editor/modules/data/data.js:140 msgid "No, use version loaded from the server" diff --git a/apps/wiki/templates/wiki/bootstrap.html b/apps/wiki/templates/wiki/bootstrap.html index 03f8d4ce..fc5623bd 100644 --- a/apps/wiki/templates/wiki/bootstrap.html +++ b/apps/wiki/templates/wiki/bootstrap.html @@ -70,7 +70,7 @@ properties: [ {name: 'version', label: '{% trans 'Version' %}'}, {name: 'stage', label: '{% trans 'Stage' %}'}, - {name: 'assignment', label: '{% trans 'Assignment' %}'}, + {name: 'assignment', label: '{% trans 'Assignment' %}'} ] }, @@ -347,7 +347,7 @@ return '{{MEDIA_URL}}{{IMAGE_DIR}}{{slug}}/' + attachmentName; }, documentUrl: function(id, version) { - var url = '{% url 'wiki_editor' slug %}' + var url = '{% url 'wiki_editor' slug %}'; if(version) { url = url + '?version=' + version; } @@ -361,7 +361,7 @@ {% for value,text in tags %} {value:'{{value|default:''}}', text:'{{text}}'} {% if not forloop.last %}, {% endif %} {% endfor %} - ], description: '{{forms.text_save.stage_completed.help_text}}'}, + ], description: '{{forms.text_save.stage_completed.help_text}}'} ], content_field_name: '{{forms.text_save.text.html_name}}', version_field_name: '{{forms.text_save.parent_revision.html_name}}' @@ -376,9 +376,20 @@ }; {% if can_pubmark %} - config.documentSaveForm.fields.push( - {label: '{{forms.text_save.publishable.label}}', name: '{{forms.text_save.publishable.html_name}}', type: 'checkbox', description: '{{forms.text_save.publishable.help_text}}'} - ); + config.documentSaveForm.fields.push({ + label: '{{forms.text_save.publishable.label}}', + name: '{{forms.text_save.publishable.html_name}}', + type: 'checkbox', + description: '{{forms.text_save.publishable.help_text}}', + checked: false + }); + config.documentSaveForm.fields.push({ + label: '{{forms.text_save.for_cybernauts.label}}', + name: '{{forms.text_save.for_cybernauts.html_name}}', + type: 'checkbox', + description: '{{forms.text_save.for_cybernauts.help_text}}', + checked: {{ forms.text_save.for_cybernauts.field.initial|yesno:"true,false" }} + }); {% endif %} {% if not request.user.is_authenticated %} diff --git a/apps/wiki/templates/wiki/document_details.html b/apps/wiki/templates/wiki/document_details.html deleted file mode 100644 index db003d2c..00000000 --- a/apps/wiki/templates/wiki/document_details.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends "wiki/document_details_base.html" %} -{% load i18n %} - -{% block extrabody %} -{{ block.super }} - - -{% endblock %} - -{% block tabs-menu %} - {% include "wiki/tabs/summary_view_item.html" %} - {% include "wiki/tabs/wysiwyg_editor_item.html" %} - {% include "wiki/tabs/source_editor_item.html" %} - {% include "wiki/tabs/history_view_item.html" %} -{% endblock %} - -{% block tabs-content %} - {% include "wiki/tabs/summary_view.html" %} - {% include "wiki/tabs/wysiwyg_editor.html" %} - {% include "wiki/tabs/source_editor.html" %} - {% include "wiki/tabs/history_view.html" %} -{% endblock %} - -{% block tabs-right %} - {% include "wiki/tabs/gallery_view_item.html" %} - {% include "wiki/tabs/annotations_view_item.html" %} - {% include "wiki/tabs/search_view_item.html" %} -{% endblock %} - -{% block splitter-extra %} -
-

-
- -{% endblock %} - -{% block dialogs %} - {% include "wiki/save_dialog.html" %} - {% include "wiki/revert_dialog.html" %} - {% include "wiki/tag_dialog.html" %} - {% if can_pubmark %} - {% include "wiki/pubmark_dialog.html" %} - {% endif %} -{% endblock %} diff --git a/apps/wiki/templates/wiki/save_dialog.html b/apps/wiki/templates/wiki/save_dialog.html deleted file mode 100644 index 31c5b014..00000000 --- a/apps/wiki/templates/wiki/save_dialog.html +++ /dev/null @@ -1,59 +0,0 @@ -{% load i18n %} -
-
- {% csrf_token %} -

{{ forms.text_save.comment.label }}

-

- {{ forms.text_save.comment.help_text}} - -

- {{forms.text_save.comment }} - - - - {% if request.user.is_anonymous %} - - - - - - - - - -
{{ forms.text_save.author_name.label }}:{{ forms.text_save.author_name }} - {{ forms.text_save.author_name.help_text }} -
{{ forms.text_save.author_email.label }}:{{ forms.text_save.author_email }} - {{ forms.text_save.author_email.help_text }} -
- {% else %} -

- {{ forms.text_save.stage_completed.label }}: - {{ forms.text_save.stage_completed }} - {{ forms.text_save.stage_completed.help_text }} - -

- {% if can_pubmark %} -

- {{ forms.text_save.publishable.label_tag }}: - {{ forms.text_save.publishable }} - {{ forms.text_save.publishable.help_text }} - -

- {% endif %} - - {% endif %} - - - {% for f in forms.text_save.hidden_fields %} - {{ f }} - {% endfor %} - -

- -

- - -

-
-
diff --git a/apps/wiki/views.py b/apps/wiki/views.py index d68a3512..20dca02f 100644 --- a/apps/wiki/views.py +++ b/apps/wiki/views.py @@ -82,7 +82,7 @@ def editor(request, slug, chunk=None, template_name='wiki/bootstrap.html'): del last_books[oldest_key] request.session['wiki_last_books'] = last_books - save_form = forms.DocumentTextSaveForm(user=request.user, prefix="textsave") + save_form = forms.DocumentTextSaveForm(user=request.user, chunk=chunk, prefix="textsave") try: version = int(request.GET.get('version', None)) except: @@ -152,7 +152,7 @@ def text(request, chunk_id): return HttpResponseForbidden("Not authorized.") if request.method == 'POST': - form = forms.DocumentTextSaveForm(request.POST, user=request.user, prefix="textsave") + form = forms.DocumentTextSaveForm(request.POST, user=request.user, chunk=doc, prefix="textsave") if form.is_valid(): if request.user.is_authenticated(): author = request.user @@ -177,6 +177,8 @@ def text(request, chunk_id): author_email=form.cleaned_data['author_email'], publishable=publishable, ) + doc.book.for_cybernauts = form.cleaned_data['for_cybernauts'] + doc.book.save() revision = doc.revision() return JSONResponse({ 'text': doc.materialize() if parent_revision != revision else None, -- 2.20.1 From 30867afe6b13d2a6a85d47b23f22f12e0d4c388b Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Wed, 30 Mar 2016 11:00:44 +0200 Subject: [PATCH 11/16] var in .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 920f51fa..ace0e686 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ requirements.pybundle /redakcja/media /static .sass-cache +var # Python garbage *.pyc -- 2.20.1 From 3b7f8a9926c3de750443801404309a2aa8659d14 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Fri, 1 Apr 2016 13:19:56 +0200 Subject: [PATCH 12/16] code style --- apps/catalogue/helpers.py | 18 +++++++------- apps/catalogue/views.py | 50 ++++++++++++++++++++++----------------- apps/wiki/helpers.py | 7 ++++-- 3 files changed, 41 insertions(+), 34 deletions(-) diff --git a/apps/catalogue/helpers.py b/apps/catalogue/helpers.py index d340b461..4af1d2df 100644 --- a/apps/catalogue/helpers.py +++ b/apps/catalogue/helpers.py @@ -1,14 +1,13 @@ +# -*- coding: utf-8 -*- from datetime import date from functools import wraps from os.path import join -from os import listdir, stat +from os import listdir from shutil import move, rmtree from django.conf import settings import re import filecmp -from django.db.models import Count - def active_tab(tab): """ @@ -70,7 +69,7 @@ class GalleryMerger(object): @property def was_merged(self): - "Check if we have gallery size recorded" + """Check if we have gallery size recorded""" return self.dest_size is not None def merge(self): @@ -106,7 +105,8 @@ class GalleryMerger(object): for f in files: p = self.get_prefix(f) if p: - if p > last_pfx: last_pfx = p + if p > last_pfx: + last_pfx = p else: files_prefixed = False break @@ -122,7 +122,7 @@ class GalleryMerger(object): for f in files_other: pfx = self.get_prefix(f) if pfx is not None: - if not pfx in prefixes: + if pfx not in prefixes: last_pfx += 1 prefixes[pfx] = last_pfx renamed_files_other[f] = self.set_prefix(f, prefixes[pfx]) @@ -138,11 +138,9 @@ class GalleryMerger(object): # finally, move / rename files. for frm, to in renamed_files.items(): - move(join(self.path(self.dest), frm), - join(self.path(self.dest), to)) + move(join(self.path(self.dest), frm), join(self.path(self.dest), to)) for frm, to in renamed_files_other.items(): - move(join(self.path(self.src), frm), - join(self.path(self.dest), to)) + move(join(self.path(self.src), frm), join(self.path(self.dest), to)) rmtree(join(self.path(self.src))) return self.dest diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 981206c8..a1a1ab3c 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- -from datetime import datetime, date, timedelta +from datetime import date, timedelta import logging import os -from StringIO import StringIO from urllib import unquote from urlparse import urlsplit, urlunsplit @@ -11,7 +10,7 @@ from django.contrib import auth from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required, permission_required from django.core.urlresolvers import reverse -from django.db.models import Count, Q +from django.db.models import Count from django.db import transaction from django import http from django.http import Http404, HttpResponse, HttpResponseForbidden @@ -26,7 +25,7 @@ from apiclient import NotAuthorizedError from catalogue import forms from catalogue import helpers from catalogue.helpers import active_tab -from catalogue.models import Book, Chunk, BookPublishRecord, ChunkPublishRecord, Project +from catalogue.models import Book, Chunk, Project from fileupload.views import UploadView, PackageView # @@ -54,11 +53,11 @@ def user(request, username): @never_cache def my(request): return render(request, 'catalogue/my_page.html', { - 'last_books': sorted(request.session.get("wiki_last_books", {}).items(), - key=lambda x: x[1]['time'], reverse=True), - - "logout_to": '/', - }) + 'last_books': sorted( + request.session.get("wiki_last_books", {}).items(), + key=lambda x: x[1]['time'], reverse=True), + 'logout_to': '/', + }) @active_tab('users') @@ -136,7 +135,7 @@ def upload(request): if request.method == "POST": form = forms.DocumentsUploadForm(request.POST, request.FILES) if form.is_valid(): - import slughifi + from slughifi import slughifi if request.user.is_authenticated(): creator = request.user @@ -162,7 +161,7 @@ def upload(request): error_list.append((filename, slug, _('Slug already used in repository.'))) else: try: - zip.read(filename).decode('utf-8') # test read + zip.read(filename).decode('utf-8') # test read ok_list.append((filename, slug, title)) except UnicodeDecodeError: error_list.append((filename, title, _('File should be UTF-8 encoded.'))) @@ -239,7 +238,8 @@ def book_html(request, slug): # book_themes = book_themes.items() # book_themes.sort(key=lambda s: s[0].sort_key) - return render_to_response('catalogue/book_text.html', locals(), + return render_to_response( + 'catalogue/book_text.html', locals(), context_instance=RequestContext(request)) @@ -254,8 +254,7 @@ def book_pdf(request, slug): # TODO: error handling pdf_file = doc.as_pdf() from catalogue.ebook_utils import serve_file - return serve_file(pdf_file.get_filename(), - book.slug + '.pdf', 'application/pdf') + return serve_file(pdf_file.get_filename(), book.slug + '.pdf', 'application/pdf') @never_cache @@ -331,7 +330,8 @@ def chunk_add(request, slug, chunk): creator = request.user else: creator = None - doc.split(creator=creator, + doc.split( + creator=creator, slug=form.cleaned_data['slug'], title=form.cleaned_data['title'], gallery_start=form.cleaned_data['gallery_start'], @@ -393,17 +393,18 @@ def chunk_edit(request, slug, chunk): @login_required def chunk_mass_edit(request): if request.method == 'POST': - ids = map(int, filter(lambda i: i.strip()!='', request.POST.get('ids').split(','))) + ids = map(int, filter(lambda i: i.strip() != '', request.POST.get('ids').split(','))) chunks = map(lambda i: Chunk.objects.get(id=i), ids) stage = request.POST.get('stage') if stage: try: stage = Chunk.tag_model.objects.get(slug=stage) - except Chunk.DoesNotExist, e: + except Chunk.DoesNotExist: stage = None - for c in chunks: c.stage = stage + for c in chunks: + c.stage = stage username = request.POST.get('user') logger.info("username: %s" % username) @@ -414,7 +415,8 @@ def chunk_mass_edit(request): except User.DoesNotExist, e: user = None - for c in chunks: c.user = user + for c in chunks: + c.user = user status = request.POST.get('status') if status: @@ -442,7 +444,8 @@ def chunk_mass_edit(request): book.project = project book.save() - for c in chunks: c.save() + for c in chunks: + c.save() return HttpResponse("", content_type="text/plain") else: @@ -491,12 +494,15 @@ def publish(request, slug): class GalleryMixin(object): def get_directory(self): return "%s%s/" % (settings.IMAGE_DIR, self.object.gallery) - def get_object(self, request, slug): + + @staticmethod + def get_object(request, slug): book = get_object_or_404(Book, slug=slug) if not book.gallery: raise Http404 return book + class GalleryView(GalleryMixin, UploadView): def breadcrumbs(self): @@ -510,4 +516,4 @@ class GalleryView(GalleryMixin, UploadView): class GalleryPackageView(GalleryMixin, PackageView): def get_redirect_url(self, slug): - return reverse('catalogue_book_gallery', kwargs = dict(slug=slug)) + return reverse('catalogue_book_gallery', kwargs={'slug': slug}) diff --git a/apps/wiki/helpers.py b/apps/wiki/helpers.py index dace3d00..8983e401 100644 --- a/apps/wiki/helpers.py +++ b/apps/wiki/helpers.py @@ -1,8 +1,9 @@ +# -*- coding: utf-8 -*- from datetime import datetime from functools import wraps from django import http -from django.utils import simplejson as json +import json from django.utils.functional import Promise @@ -21,7 +22,9 @@ class ExtendedEncoder(json.JSONEncoder): # shortcut for JSON reponses class JSONResponse(http.HttpResponse): - def __init__(self, data={}, **kwargs): + def __init__(self, data=None, **kwargs): + if data is None: + data = {} # get rid of mimetype kwargs.pop('mimetype', None) -- 2.20.1 From 391b3e40affcdacc99dae60cc2dd51f30114fd94 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Fri, 1 Apr 2016 16:55:20 +0200 Subject: [PATCH 13/16] ajax decorator --- apps/catalogue/helpers.py | 66 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/apps/catalogue/helpers.py b/apps/catalogue/helpers.py index 4af1d2df..060d106c 100644 --- a/apps/catalogue/helpers.py +++ b/apps/catalogue/helpers.py @@ -1,12 +1,18 @@ # -*- coding: utf-8 -*- +import filecmp +import json +import re from datetime import date from functools import wraps -from os.path import join +from inspect import getargspec from os import listdir +from os.path import join from shutil import move, rmtree + from django.conf import settings -import re -import filecmp +from django.http import HttpResponse +from django.template import RequestContext +from django.template.loader import render_to_string def active_tab(tab): @@ -36,6 +42,60 @@ def cached_in_field(field_name): return decorator +class AjaxError(Exception): + pass + + +def ajax(method, template=None, login_required=False, permission_required=None): + def decorator(fun): + @wraps(fun) + def ajax_view(request): + kwargs = {} + request_params = None + if method == 'post': + request_params = request.POST + elif method == 'get': + request_params = request.GET + fun_params, xx, fun_kwargs, defaults = getargspec(fun) + if defaults: + required_params = fun_params[1:-len(defaults)] + else: + required_params = fun_params[1:] + missing_params = set(required_params) - set(request_params) + if missing_params: + res = { + 'result': 'error', + 'msg': 'missing params: %s' % ', '.join(missing_params), + } + else: + if request_params: + request_params = dict( + (key, json.loads(value)) + for key, value in request_params.iteritems() + if fun_kwargs or key in fun_params) + kwargs.update(request_params) + res = None + if login_required and not request.user.is_authenticated(): + res = {'result': 'error', 'msg': 'logout'} + if (permission_required and + not request.user.has_perm(permission_required)): + res = {'result': 'error', 'msg': 'access denied'} + if not res: + try: + res = fun(request, **kwargs) + if res and template: + res = {'html': render_to_string(template, res, RequestContext(request))} + except AjaxError as e: + res = {'result': e.args[0]} + if 'result' not in res: + res['result'] = 'ok' + return HttpResponse(json.dumps(res), content_type='application/json; charset=utf-8') + + return ajax_view + + return decorator + + def parse_isodate(isodate): try: return date(*[int(p) for p in isodate.split('-')]) -- 2.20.1 From 48625c4ed3b93daecc8df786f6fdc45a2477122e Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Fri, 1 Apr 2016 17:04:39 +0200 Subject: [PATCH 14/16] lessons for cybernauts (ajax view) --- apps/catalogue/urls.py | 2 ++ apps/catalogue/views.py | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/apps/catalogue/urls.py b/apps/catalogue/urls.py index e74f9162..ec43053f 100644 --- a/apps/catalogue/urls.py +++ b/apps/catalogue/urls.py @@ -51,4 +51,6 @@ urlpatterns = patterns('catalogue.views', 'chunk_mass_edit', name='catalogue_chunk_mass_edit'), url(r'^track/(?P[^/]*)/$', PublishTrackFeed()), + + url(r'^cybernauci/$', 'lessons_for_cybernauts'), ) diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index a1a1ab3c..d07303f4 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -24,7 +24,7 @@ from django.template import RequestContext from apiclient import NotAuthorizedError from catalogue import forms from catalogue import helpers -from catalogue.helpers import active_tab +from catalogue.helpers import active_tab, ajax from catalogue.models import Book, Chunk, Project from fileupload.views import UploadView, PackageView @@ -517,3 +517,22 @@ class GalleryPackageView(GalleryMixin, PackageView): def get_redirect_url(self, slug): return reverse('catalogue_book_gallery', kwargs={'slug': slug}) + + +@ajax(method='get') +def lessons_for_cybernauts(request): + books = Book.objects.filter(for_cybernauts=True) + data = [] + for book in books: + try: + changes = book.get_current_changes() + time_changed = max(change.created_at for change in changes) + xml_url = reverse('catalogue_book_xml', args=[book.slug]) + data.append({ + 'slug': book.slug, + 'url': xml_url, + 'time_changed': time_changed.isoformat(), + }) + except Book.NoTextError: + pass + return {'lessons': data} -- 2.20.1 From a76e382e6a8e3e6692322f4e5f02f6443ec6529b Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Fri, 1 Apr 2016 17:06:02 +0200 Subject: [PATCH 15/16] editor update --- apps/wiki/static/wiki/editor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wiki/static/wiki/editor b/apps/wiki/static/wiki/editor index 8411d228..9d7a8f49 160000 --- a/apps/wiki/static/wiki/editor +++ b/apps/wiki/static/wiki/editor @@ -1 +1 @@ -Subproject commit 8411d228c0928c0a2d6c280a2f39adacc972ee13 +Subproject commit 9d7a8f4916f03faa473d31a219102558f1844475 -- 2.20.1 From dcec6f192ac49d32de7eba285112c1d1157e4df4 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Fri, 27 May 2016 17:27:16 +0200 Subject: [PATCH 16/16] minor fix in verbose names --- apps/catalogue/models/publish_log.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/catalogue/models/publish_log.py b/apps/catalogue/models/publish_log.py index f422e377..f26d8ac9 100755 --- a/apps/catalogue/models/publish_log.py +++ b/apps/catalogue/models/publish_log.py @@ -22,7 +22,7 @@ class BookPublishRecord(models.Model): app_label = 'catalogue' ordering = ['-timestamp'] verbose_name = _('book publish record') - verbose_name = _('book publish records') + verbose_name_plural = _('book publish records') class ChunkPublishRecord(models.Model): @@ -36,4 +36,4 @@ class ChunkPublishRecord(models.Model): class Meta: app_label = 'catalogue' verbose_name = _('chunk publish record') - verbose_name = _('chunk publish records') + verbose_name_plural = _('chunk publish records') -- 2.20.1