Date: Thu, 16 Nov 2017 12:06:51 +0100
Subject: [PATCH 07/16] update messages
---
wtem/management/commands/wtem_send_keys.py | 2 +-
wtem/templates/wtem/email_key.txt | 2 +-
wtem/templates/wtem/main_before.html | 2 +-
wtem/templates/wtem/start.html | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/wtem/management/commands/wtem_send_keys.py b/wtem/management/commands/wtem_send_keys.py
index 8e26624..9d14a26 100644
--- a/wtem/management/commands/wtem_send_keys.py
+++ b/wtem/management/commands/wtem_send_keys.py
@@ -64,6 +64,6 @@ class Command(BaseCommand):
def send_key(self, submission):
self.stdout.write('>>> sending to ' + submission.email)
send_mail(
- subject="Olimpiada Cyfrowa - Twój link do egzaminu",
+ subject="Olimpiada Cyfrowa - Twój link do zadaŠI etapu",
body=render_to_string('wtem/email_key.txt', dict(submission=submission)),
to=[submission.email])
diff --git a/wtem/templates/wtem/email_key.txt b/wtem/templates/wtem/email_key.txt
index 76e629a..811d50b 100644
--- a/wtem/templates/wtem/email_key.txt
+++ b/wtem/templates/wtem/email_key.txt
@@ -5,7 +5,7 @@ https://olimpiadacyfrowa.pl{% url 'wtem_start' submission_id=submission.id key=s
I etap Olimpiady odbÄdzie siÄ w czwartek 23 listopada o godz. 10:00 w sali wyznaczonej przez TwojÄ
KomisjÄ SzkolnÄ
. Test bÄdzie siÄ skÅadaÅ z 50 pytaÅ, które otrzymasz w losowej kolejnoÅci. Po udzieleniu odpowiedzi na dane pytanie nie ma możliwoÅci powrotu do niego i zmiany odpowiedzi. Na rozwiÄ
zanie caÅego testu bÄdziesz mieÄ 60 minut.
-Aby rozwiÄ
zaÄ test, potrzebny Ci bÄdzie komputer ze stabilnym ÅÄ
czem internetowym oraz zainstalowanÄ
i zaktualizowanÄ
przeglÄ
darkÄ
.
+Aby rozwiÄ
zaÄ test, potrzebny Ci bÄdzie komputer ze stabilnym ÅÄ
czem internetowym oraz zainstalowanÄ
i zaktualizowanÄ
przeglÄ
darkÄ
lub urzÄ
dzenie mobilne (np. telefon lub tablet) z dostÄpem do internetu.
Każdy uczestnik i uczestniczka otrzymuje indywidualny link, pod którym znajdzie zadania I etapu Olimpiady Cyfrowej. Przypominamy, że zgodnie z Regulaminem, każdy zobowiÄ
zany jest do samodzielnego rozwiÄ
zania testu. Wszelkie dziaÅania ÅwiadczÄ
ce o niesamodzielnej pracy poskutkujÄ
dyskwalifikacjÄ
.
diff --git a/wtem/templates/wtem/main_before.html b/wtem/templates/wtem/main_before.html
index b3c2b23..77eef09 100644
--- a/wtem/templates/wtem/main_before.html
+++ b/wtem/templates/wtem/main_before.html
@@ -6,7 +6,7 @@
Witamy w I etapie Olimpiady Cyfrowej.
Test skÅada z 50 pytaÅ, które otrzymasz w losowej kolejnoÅci. Po udzieleniu odpowiedzi na dane pytanie nie ma możliwoÅci powrotu do niego i zmiany odpowiedzi. Uwaga: czÄÅÄ pytaÅ ma jednÄ
, a czÄÅÄ kilka poprawnych odpowiedzi.
-Test rozpocznie siÄ 23 listopada o godzinie 10:00 i potrwa do 11:00.
+Test rozpocznie siÄ w czwartek 23 listopada o godzinie 10:00 i bÄdzie trwaÅ do godziny 11:00.
Powodzenia!
ZespóŠOlimpiady Cyfrowej
diff --git a/wtem/templates/wtem/start.html b/wtem/templates/wtem/start.html
index c938b76..d0f5b4d 100644
--- a/wtem/templates/wtem/start.html
+++ b/wtem/templates/wtem/start.html
@@ -9,7 +9,7 @@
Test skÅada z {{ exercise_count }} pytaÅ, które otrzymasz w losowej kolejnoÅci.
Po udzieleniu odpowiedzi na dane pytanie nie ma możliwoÅci powrotu do niego i zmiany odpowiedzi.
Uwaga: czÄÅÄ pytaÅ ma jednÄ
, a czÄÅÄ kilka poprawnych odpowiedzi.
- Test rozpoczyna siÄ o godzinie 10:00 i trwa do 11:00.
+ Test rozpoczÄ
Å siÄ o godzinie 10:00 i trwa do godziny 11:00.
Powodzenia!
ZespóŠOlimpiady Cyfrowej
--
2.20.1
From fa2bc70331278decaf3e525607f10bb1bbd92908 Mon Sep 17 00:00:00 2001
From: Jan Szejko
Date: Thu, 16 Nov 2017 14:18:30 +0100
Subject: [PATCH 08/16] cleanup contact forms
---
edumed/contact_forms.py | 518 +---------------------------------------
1 file changed, 1 insertion(+), 517 deletions(-)
diff --git a/edumed/contact_forms.py b/edumed/contact_forms.py
index 196e5e4..5ee5892 100644
--- a/edumed/contact_forms.py
+++ b/edumed/contact_forms.py
@@ -1,13 +1,8 @@
# -*- coding: utf-8 -*-
from django import forms
from django.forms.formsets import BaseFormSet
-from django.utils.safestring import mark_safe
from contact.forms import ContactForm
-from django.core.mail import send_mail
-from django.core.exceptions import ValidationError
-from django.core.validators import validate_email
-from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _
WOJEWODZTWA = (
@@ -32,96 +27,6 @@ WOJEWODZTWA = (
WOJEWODZTWO_CHOICES = [(u'', u'(wybierz)')] + [(w, w) for w in WOJEWODZTWA]
-class RegistrationForm(ContactForm):
- form_tag = 'sugestie'
- form_title = u"ZgÅoÅ sugestiÄ"
- admin_list = ['podpis', 'contact', 'temat']
-
- contact = forms.EmailField(label=u'E-mail', max_length=128, required=False)
- podpis = forms.CharField(label=u'Podpis', max_length=128, required=False)
- temat = forms.CharField(label=u'Temat zgÅoszenia', max_length=255)
- tresc = forms.CharField(label=u'TreÅÄ', widget=forms.Textarea, max_length=1800)
-
-
-class CooperateForm(ContactForm):
- form_tag = 'wspolpraca'
- form_title = u"BÄ
dź z nami w kontakcie"
- admin_list = ['podpis', 'contact']
-
- podpis = forms.CharField(label=u'ImiÄ i nazwisko', max_length=128)
- contact = forms.EmailField(label=u'E-mail', max_length=128)
- instytucja = forms.CharField(
- label=u'Instytucja (nazwa, adres)', widget=forms.Textarea, max_length=1000, required=False)
- uwagi = forms.CharField(label=u'Uwagi', widget=forms.Textarea, max_length=1800, required=False)
-
- zajecia_przedszkole = forms.BooleanField(label=u'ProwadzÄ zajÄcia z dzieÄmi w wieku przedszkolnym', required=False)
- zajecia_sp13 = forms.BooleanField(label=u'ProwadzÄ zajÄcia z dzieÄmi z SP kl. 1-3', required=False)
- zajecia_sp46 = forms.BooleanField(label=u'ProwadzÄ zajÄcia z dzieÄmi z SP kl. 4-6', required=False)
- zajecia_gimnazjum = forms.BooleanField(label=u'ProwadzÄ zajÄcia z mÅodzieżÄ
w wieku gimnazjalnym', required=False)
- zajecia_ponadgimnazjalne = forms.BooleanField(
- label=u'ProwadzÄ zajÄcia z mÅodzieżÄ
ze szkóŠponadgimnazjalnych', required=False)
- zajecia_wyzsze = forms.BooleanField(label=u'ProwadzÄ zajÄcia w szkole wyższej', required=False)
- zajecia_dorosli = forms.BooleanField(label=u'ProwadzÄ zajÄcia dla dorosÅych', required=False)
- zajecia_seniorzy = forms.BooleanField(label=u'ProwadzÄ zajÄcia dla seniorów', required=False)
- zgoda_dane = forms.BooleanField(
- label=u'OÅwiadczam, że wyrażam zgodÄ na przetwarzanie moich danych osobowych zawartych '
- u'w niniejszym formularzu zgÅoszeniowym przez FundacjÄ Nowoczesna Polska '
- u'(administratora danych) z siedzibÄ
w Warszawie (00-514) przy ul. MarszaÅkowskiej 84/92 '
- u'lok. 125 w celu otrzymywania newslettera Edukacja medialna. JednoczeÅnie oÅwiadczam, '
- u'że zostaÅam/em poinformowana/y o tym, że mam prawo wglÄ
du w treÅÄ swoich danych '
- u'i możliwoÅÄ ich poprawiania oraz że ich podanie jest dobrowolne, ale niezbÄdne '
- u'do dokonania zgÅoszenia.')
-
-
-class ContestForm(ContactForm):
- form_tag = 'konkurs'
- form_title = u"ZgÅoÅ siÄ do konkursu"
- admin_list = ['nazwisko', 'instytucja', 'tytul']
-
- nazwisko = forms.CharField(label=u'ImiÄ i nazwisko', max_length=128)
- contact = forms.EmailField(label=u'Adres e-mail', max_length=128)
- instytucja = forms.CharField(label=u'Instytucja (nazwa, adres)', widget=forms.Textarea, max_length=1000)
- tytul = forms.CharField(
- label=u'TytuÅ przeprowadzonej lekcji',
- help_text=u'proszÄ wymieniÄ wszystkie, jeÅli zostaÅy przeprowadzone wiÄcej niż jedne zajÄcia',
- widget=forms.Textarea, max_length=1000)
- uczestnicy = forms.CharField(label=u'Liczba uczestników', max_length=64)
- trudnosci = forms.CharField(
- label=u'Czy w trakcie zajÄÄ pojawiÅy siÄ jakieÅ trudnoÅci? JeÅli tak, to jakie?',
- widget=forms.Textarea, max_length=2000)
- pomocne = forms.CharField(
- label=u'Co w materiaÅach okazaÅo siÄ najbardziej pomocne w przygotowaniu i prowadzeniu lekcji?',
- widget=forms.Textarea, max_length=2000)
- nieprzydatne = forms.CharField(
- label=u'Co w materiaÅach okazaÅo siÄ nieprzydatne w przygotowaniu i prowadzeniu lekcji?',
- widget=forms.Textarea, max_length=2000)
- poprawic = forms.CharField(
- label=u'Jak możemy poprawiÄ serwis edukacjamedialna.edu.pl?',
- widget=forms.Textarea, max_length=2000, required=False)
- inne = forms.CharField(label=u'Inne uwagi i komentarze', widget=forms.Textarea, max_length=2000, required=False)
- zgoda_regulamin = forms.BooleanField(
- label=u'Znam i akceptujÄ regulamin konkursu Medialog.',
- help_text=u'Zobacz '
- u'regulamin konkursu MediaLog.')
- zgoda_informacje = forms.BooleanField(
- label=u'Wyrażam zgodÄ na otrzymywanie informacji od Fundacji Nowoczesna Polska zwiÄ
zanych z edukacjÄ
medialnÄ
.',
- required=False
- )
-
-
-class UdzialForm(ContactForm):
- form_tag = 'udzial'
- form_title = u"UdziaÅ"
- admin_list = ['nazwisko', 'miejscowosc', 'instytucja']
-
- nazwisko = forms.CharField(label=u'ImiÄ i nazwisko', max_length=128)
- miejscowosc = forms.CharField(label=u'MiejscowoÅÄ', max_length=128)
- instytucja = forms.CharField(label=u'Nazwa organizacji/instytucji', max_length=128)
- contact = forms.EmailField(label=u'Adres e-mail', max_length=128)
- telefon = forms.CharField(label=u'Telefon', max_length=32)
- uczestnicy = forms.IntegerField(label=u'Przewidywana liczba uczestników zajÄÄ')
-
-
class WTEMStudentForm(forms.Form):
first_name = forms.CharField(label=u'ImiÄ', max_length=128)
last_name = forms.CharField(label=u'Nazwisko', max_length=128)
@@ -140,98 +45,6 @@ class NonEmptyBaseFormSet(BaseFormSet):
forms.ValidationError(u"ProszÄ podaÄ dane przynajmniej jednej osoby.")
-class WTEMForm(ContactForm):
- disabled = True
- disabled_template = 'wtem/disabled_contact_form.html'
- form_tag = "wtem"
- form_title = u"WTEM - rejestracja uczestników"
- submit_label = u"WyÅlij zgÅoszenie"
- admin_list = ['imie', 'nazwisko', 'institution']
- form_formsets = {
- 'student': forms.formsets.formset_factory(
- WTEMStudentForm, formset=NonEmptyBaseFormSet, max_num=5, validate_max=True, extra=5),
- }
-
- contact = forms.EmailField(label=u'Adres e-mail opiekuna/opiekunki', max_length=128)
- imie = forms.CharField(label=u'ImiÄ', max_length=128)
- nazwisko = forms.CharField(label=u'Nazwisko', max_length=128)
- function = forms.CharField(label=u'PeÅniona funkcja', max_length=255)
- institution = forms.CharField(label=u'Nazwa instytucji', max_length=255)
- institution_address = forms.CharField(label=u'Adres instytucji', widget=forms.Textarea, max_length=1000)
- institution_email = forms.EmailField(label=u'Adres e-mail instytucji', max_length=128)
- institution_phone = forms.CharField(label=u'Telefon do instytucji', max_length=32)
- institution_www = forms.URLField(label=u'Strona WWW instytucji', max_length=255, required=False)
-
- zgoda_regulamin = forms.BooleanField(
- label=u'Znam i akceptujÄ regulamin Wielkiego Turnieju Edukacji Medialnej.',
- help_text=u'Zobacz '
- u'regulamin Wielkiego Turnieju Edukacji Medialnej.'
- )
- zgoda_dane = forms.BooleanField(
- label=u'Wyrażam zgodÄ na przetwarzanie moich danych osobowych oraz danych osobowych moich podopiecznych.',
- # help_text=u'Zobacz '
- # 'peÅnÄ
treÅÄ oÅwiadczenia.'
- )
-
- potw_uczniowie = forms.BooleanField(
- label=u'Potwierdzam, że zgÅoszeni Uczestnicy/Uczestniczki w chwili rejestracji sÄ
'
- u'uczniami/uczennicami szkoÅy ponadgimnazjalnej.',
- )
- zgoda_informacje = forms.BooleanField(
- label=u'Wyrażam zgodÄ na otrzymywanie informacji od Fundacji Nowoczesna Polska '
- u'zwiÄ
zanych z edukacjÄ
medialnÄ
.',
- required=False
- )
-
- extract_types = (dict(slug='extended', label=_('extended')),)
-
- @staticmethod
- def get_extract_fields(contact, extract_type_slug):
- fields = contact.body.keys()
- fields.pop(fields.index('student'))
- fields.extend(['contact', 'student_first_name', 'student_last_name', 'student_email'])
- return fields
-
- @staticmethod
- def get_extract_records(keys, contact, extract_type_slug):
- toret = [dict()]
- for field_name in keys:
- if field_name.startswith('student_'):
- continue
- if field_name == 'contact':
- val = contact.contact
- else:
- val = contact.body[field_name]
- toret[0][field_name] = val
-
- current = toret[0]
- for student in contact.body['student']:
- for attr in ('first_name', 'last_name', 'email'):
- current['student_' + attr] = student[attr]
- if current not in toret:
- toret.append(current)
- current = dict()
- return toret
-
- def save(self, request, formsets=None):
- contact = super(WTEMForm, self).save(request, formsets)
-
- mail_subject = render_to_string('contact/wtem/student_mail_subject.html').strip()
- mail_body = render_to_string('contact/wtem/student_mail_body.html')
- for formset in formsets or []:
- for f in formset.forms:
- email = f.cleaned_data.get('email', None)
- try:
- validate_email(email)
- except ValidationError:
- pass
- else:
- send_mail(mail_subject, mail_body, 'olimpiada@nowoczesnapolska.org.pl', [email],
- fail_silently=True)
-
- return contact
-
-
class CommissionForm(forms.Form):
name = forms.CharField(label=u'ImiÄ i nazwisko CzÅonka Komisji', max_length=128)
form_tag = "commission"
@@ -246,7 +59,7 @@ class OlimpiadaForm(ContactForm):
admin_list = ['nazwisko', 'school']
form_formsets = {
'student': forms.formsets.formset_factory(WTEMStudentForm, formset=NonEmptyBaseFormSet),
- 'commission': forms.formsets.formset_factory(CommissionForm, formset=BaseFormSet),
+ 'commission': forms.formsets.formset_factory(CommissionForm),
}
contact = forms.EmailField(label=u'Adres e-mail PrzewodniczÄ
cego/PrzewodniczÄ
cej', max_length=128)
@@ -324,332 +137,3 @@ class OlimpiadaForm(ContactForm):
first_name=first_name, last_name=last_name, email=email, contact=contact)
confirmation.send_mail()
return contact
-
-
-class MILForm(ContactForm):
- form_tag = 'mil'
- form_title = _('Share your thoughts on the "Media and information literacy competencies catalogue"')
- submit_label = _('Submit')
- base_template = 'base_mil.html'
- site_name = site_domain = 'katalog.nowoczesnapolska.org.pl'
-
- name = forms.CharField(label=_('Name and Surname'), max_length=255)
- contact = forms.EmailField(label=_('E-mail'), max_length=255)
-
- institution = forms.CharField(label=_('Institution'), widget=forms.Textarea, max_length=8192)
-
- question_stages = forms.CharField(
- label=_('What do you think about the proposed educational stages classification?'),
- widget=forms.Textarea,
- max_length=255,
- required=False)
-
- question_fields = forms.CharField(
- label=_('What do you think about the proposed thematic fields?'),
- widget=forms.Textarea,
- max_length=255,
- required=False)
-
- question_left_out = forms.CharField(
- label=_('What important areas of media and information literacy have been left out?'),
- widget=forms.Textarea,
- max_length=255,
- required=False)
-
- other = forms.CharField(
- label=_('Other suggestions and comments'),
- widget=forms.Textarea,
- max_length=255,
- required=False)
-
-
-class TEMForm(ContactForm):
- form_tag = 'tem'
- form_title = u"TEM - szkolenie dla trenerów edukacji medialnej"
- admin_list = ['imie', 'nazwisko', 'instytucja', 'contact']
-
- imie = forms.CharField(label=u'ImiÄ', max_length=128)
- nazwisko = forms.CharField(label=u'Nazwisko', max_length=128)
- contact = forms.EmailField(label=u'E-mail', max_length=128)
- telefon = forms.CharField(label=u'Tel. kontaktowy', max_length=128)
- instytucja = forms.CharField(label=u'Instytucja', max_length=256)
- adres = forms.CharField(label=u'Adres', widget=forms.Textarea, max_length=1000)
- stanowisko = forms.CharField(label=u'Stanowisko', max_length=256)
- doswiadczenie = forms.CharField(
- label=u'Jakie jest Pani/Pana doÅwiadczenie w zakresie edukacji medialnej?',
- widget=forms.Textarea, max_length=500, help_text=u'(max 500 znaków)')
- dlaczego = forms.CharField(
- label=u'Dlaczego chce Pani/Pan wziÄ
Ä udziaÅ w szkoleniu?',
- widget=forms.Textarea, max_length=500, help_text=u'(max 500 znaków)')
- jak_wykorzystac = forms.CharField(
- label=u'Jak zamierza Pan/Pani wykorzystaÄ wiedzÄ zdobytÄ
w czasie szkolenia?',
- widget=forms.Textarea, max_length=500, help_text=u'(max 500 znaków)')
-
- zajecia = forms.BooleanField(
- label=u'W okresie wrzesieÅ-październik 2015 r. przeprowadzÄ min. 2 godziny zajÄÄ edukacji medialnej '
- u'z wybranÄ
grupÄ
dzieci lub mÅodzieży.', required=True)
- zgoda_informacje = forms.BooleanField(
- label=u'Wyrażam zgodÄ na otrzymywanie informacji od Fundacji Nowoczesna Polska '
- u'zwiÄ
zanych z edukacjÄ
medialnÄ
.', required=False)
-
-
-class SuperwizjaForm(ContactForm):
- form_tag = 'superwizja'
- form_title = u"Informacje o zajÄciach"
- admin_list = ['nazwisko', 'contact', 'skype', 'temat']
- submit_label = u'WyÅlij'
-
- nazwisko = forms.CharField(label=u'ImiÄ i nazwisko', max_length=1024)
- contact = forms.CharField(label=u'E-mail kontaktowy', required=False)
- skype = forms.CharField(label=u'Nazwa użytkownika Skype', max_length=255)
- temat = forms.CharField(label=u'Temat zajÄÄ', max_length=1024)
- termin = forms.CharField(label=u'Termin zajÄÄ', max_length=1024)
- czas_trwania = forms.CharField(label=u'Czas trwania zajÄÄ', max_length=1024)
- miejsce = forms.CharField(label=u'Miejsce prowadzenia zajÄÄ', max_length=1024)
- rodzaj = forms.ChoiceField(
- label=u'Rodzaj zajÄÄ', widget=forms.RadioSelect,
- choices=[('jednorazowe', 'jednorazowe'), ('w ramach cyklu', 'w ramach cyklu')])
- cykl = forms.CharField(label=u'JeÅli w ramach cyklu, to podaj jego temat i czas trwania', required=False)
- sposob = forms.ChoiceField(
- label=u'Sposób prowadzenia zajÄÄ', widget=forms.RadioSelect,
- choices=[('samodzielnie', 'samodzielnie'), (u'z drugÄ
osobÄ
', 'z drugÄ
osobÄ
')])
- wrazenia = forms.CharField(
- label=u'Opisz Twoje ogólne wrażenia po warsztacie.', widget=forms.Textarea, max_length=4096)
- opiekun = forms.CharField(
- label=u'Czy opiekun grupy byÅ obecny podczas zajÄÄ? JeÅli tak, opisz krótko jego rolÄ.',
- widget=forms.Textarea, max_length=4096)
- grupa = forms.CharField(
- label=u'Opisz krótko grupÄ uczestników zajÄÄ (wiek, liczba osób, czy to pierwszy kontakt z grupÄ
).',
- widget=forms.Textarea, max_length=4096)
- cel = forms.CharField(
- label=u'Jaki byÅ zaÅożony cel zajÄÄ? Dlaczego wybraÅaÅ/eÅ taki cel?', widget=forms.Textarea, max_length=4096)
- ewaluacja = forms.CharField(
- label=u'W jaki sposób sprawdziÅeÅ/aÅ, czy cel zajÄÄ zostaÅ zrealizowany? Opisz krótko efekty zajÄÄ.',
- widget=forms.Textarea, max_length=4096)
- # header
- przygotowania = forms.CharField(
- label=u'Opisz w punktach proces przygotowania siÄ do zajÄÄ.', widget=forms.Textarea, max_length=4096)
- przygotowania_trudnosci = forms.CharField(
- label=u'Co na etapie przygotowaÅ sprawiÅo Ci najwiÄkszÄ
trudnoÅÄ?', widget=forms.Textarea, max_length=4096)
- przygotowania_pomoc = forms.CharField(
- label=u'Co byÅo pomocne w przygotowaniu zajÄÄ? '
- u'(Czy korzystaÅaÅ/eÅ z materiaÅów z serwisu edukacjamedialna.edu.pl? JeÅli tak, to jakich?)',
- widget=forms.Textarea, max_length=4096)
- narzedzia = forms.CharField(
- label=u'Jakie narzÄdzie/a planowaÅaÅ/eÅ wykorzystaÄ, a jakie wykorzystaÅaÅ/eÅ?',
- widget=forms.Textarea, max_length=4096)
- struktura = forms.CharField(
- label=u'Opisz w punktach strukturÄ zajÄÄ. '
- u'Zaznacz ile czasu planowaÅaÅ/eÅ na każdÄ
czÄÅÄ, a ile czasu faktycznie Ci to zajÄÅo.',
- widget=forms.Textarea, max_length=4096)
- prowadzenie_trudnosci = forms.CharField(
- label=u'Co sprawiaÅo Ci trudnoÅÄ w prowadzeniu zajÄÄ?', widget=forms.Textarea, max_length=4096)
- prowadzenie_pomoc = forms.CharField(
- label=u'Co byÅo pomocne w prowadzeniu zajÄÄ?', widget=forms.Textarea, max_length=4096)
- kontrakt = forms.CharField(
- label=u'W jakiej formie zostaÅ zawarty kontrakt z uczestnikami? Jakie zasady zostaÅy przyjÄte? '
- u'Czy w trakcie zajÄÄ Ty bÄ
dź uczestnicy odwoÅywaliÅcie siÄ do kontraktu?',
- widget=forms.Textarea, max_length=4096)
- trudne_sytuacje = forms.CharField(
- label=u'Czy podczas zajÄÄ miaÅy miejsce tzw. âtrudne sytuacjeâ. '
- u'Jak na nie zareagowaÅaÅ/eÅ? Czy potrzebowaÅabyÅ/ÅbyÅ czegoÅ w zwiÄ
zku z nimi?',
- widget=forms.Textarea, max_length=4096)
- informacje_zwrotne = forms.CharField(
- label=u'Czy zbieraÅaÅ/eÅ informacje zwrotne od uczestników? JeÅli tak, na co zwrócili uwagÄ? '
- u'W jaki sposób zbieraÅaÅ/eÅ informacje zwrotne?', widget=forms.Textarea, max_length=4096)
-
- mocne_strony = forms.CharField(
- label=u'Opisz w punktach mocne strony przeprowadzonych zajÄÄ.', widget=forms.Textarea, max_length=4096)
- zmiany = forms.CharField(
- label=u'Opisz w punktach, co byÅ zmieniÅ(a) na przyszÅoÅÄ.', widget=forms.Textarea, max_length=4096)
- potrzeby = forms.CharField(
- label=u'Czy potrzebowaÅbyÅ/ÅbyÅ czegoÅ przed nastÄpnymi zajÄciami?', widget=forms.Textarea, max_length=4096)
- uwagi = forms.CharField(label=u'Inne uwagi', widget=forms.Textarea, max_length=4096, required=False)
-
-
-class CybernauciForm(ContactForm):
- disabled = True
- disabled_template = 'contact/disabled_contact_form.html'
- form_tag = 'trenerzy-cybernauci'
- form_title = u"Cybernauci â szkolenie dla trenerów"
- admin_list = ['nazwisko', 'instytucja', 'contact']
- submit_label = u'WyÅlij'
-
- nazwisko = forms.CharField(label=u'ImiÄ i nazwisko', max_length=1024)
- contact = forms.CharField(label=u'E-mail kontaktowy')
- telefon = forms.CharField(label=u'Telefon', max_length=32)
- wojewodztwo = forms.ChoiceField(label=u'Województwo', choices=WOJEWODZTWO_CHOICES)
- dlaczego = forms.CharField(
- label=u'ProszÄ opisaÄ, dlaczego chce Pan/Pani zostaÄ Emisariuszem Bezpiecznego Internetu.',
- widget=forms.Textarea, max_length=4096)
- grupy = forms.MultipleChoiceField(
- label=u'ProszÄ wskazaÄ, dla których grup realizowaÅ Pan/ realizowaÅa Pani zajÄcia warsztatowe',
- widget=forms.CheckboxSelectMultiple,
- choices=[
- ('Uczniowie klas 1-3', 'Uczniowie klas 1-3'),
- ('Uczniowie klas 4-6', 'Uczniowie klas 4-6'),
- ('Uczniowie szkóŠgimnazjalnych', 'Uczniowie szkóŠgimnazjalnych'),
- ('Uczniowie szkóŠponadgimnazjalnych', 'Uczniowie szkóŠponadgimnazjalnych'),
- ('Nauczyciele', 'Nauczyciele'),
- ('Rodzice', 'Rodzice'),
- ])
- doswiadczenie_grupy = forms.CharField(
- label=u'ProszÄ opisaÄ swoje doÅwiadczenie w pracy warsztatowej z grupami docelowymi Projektu '
- u'(dzieÄmi, mÅodzieżÄ
, osobami dorosÅymi: nauczycielami, rodzicami).',
- widget=forms.Textarea, max_length=4096)
- doswiadczenie_edumed = forms.CharField(
- label=u'Jakie jest Pana/Pani doÅwiadczenie w zakresie edukacji medialnej,'
- u'zwÅaszcza w zakresie bezpieczeÅstwa w Internecie i korzystania z TIK?'
- u' SkÄ
d czerpie Pan/Pani wiedzÄ w tym zakresie? W jakich projektach braÅ'
- u' Pan/braÅa Pani udziaÅ dotychczas?',
- widget=forms.Textarea, max_length=4096)
- szkolenia = forms.CharField(
- label=u'ProszÄ wymieniÄ studia, szkolenia albo kursy (maks. 5 najważniejszych) '
- u'powiÄ
zane z tematykÄ
Projektu, w których Pan/Pani uczestniczyÅ/Åa, '
- u'w tym dane na temat instytucji czy osoby prowadzÄ
cej (z JEDNOZDANIOWYM '
- u'omówieniem i terminami, w których siÄ odbyÅy).',
- widget=forms.Textarea, max_length=4096)
- realizacje = forms.CharField(
- label=u'ProszÄ opisaÄ swoje doÅwiadczenie w zakresie realizacji dziaÅaÅ w lokalnym Årodowisku '
- u'szkolnym (np. na terenie gminy/powiatu/województwa).',
- widget=forms.Textarea, max_length=4096)
- cel = forms.CharField(
- label=u'ProszÄ opisaÄ, jakÄ
wiedzÄ i umiejÄtnoÅci chce Pan/Pani zdobyÄ '
- u'lub doskonaliÄ poprzez uczestnictwo w Szkoleniu trenerskim.',
- widget=forms.Textarea, max_length=4096)
- zgoda_regulamin = forms.BooleanField(
- label=u'OÅwiadczam, że zapoznaÅem/zapoznaÅam siÄ z Regulaminem Rekrutacji '
- u'i Uczestnictwa w Projekcie âCybernauci â kompleksowy projekt '
- u'ksztaÅtowania bezpiecznych zachowaÅ w sieciâ i akceptujÄ jego warunki.',
- help_text=u'Zobacz regulamin.')
- zgoda_dane = forms.BooleanField(
- label=u'Wyrażam zgodÄ na przetwarzanie moich danych osobowych zawartych '
- u'w niniejszym dokumencie dla potrzeb niezbÄdnych do realizacji Projektu '
- u'âCybernauci â kompleksowy projekt ksztaÅtowania bezpiecznych zachowaÅ '
- u'w sieciâ zgodnie z ustawÄ
z dnia 29.08.1997 roku o Ochronie Danych '
- u'Osobowych (Dz. U. z 2002 r. Nr 101, poz. 926 z późniejszymi zmianami).')
- zgoda_niekaralnosc = forms.BooleanField(
- label=u'W przypadku zakwalifikowania siÄ na kurs zobowiÄ
zujÄ siÄ '
- u'do dostarczenia Åwiadectwa o niekaralnoÅci â najpóźniej w dniu rozpoczÄcia Szkolenia.')
- cv = forms.FileField(
- label=u'Wgraj plik CV.',
- help_text=u'Prosimy o nazwanie pliku swoim imieniem i nazwiskiem. Preferowany format: PDF.')
-
-
-class WLEMForm(ContactForm):
- disabled = True
- form_tag = 'wlem'
- form_title = u"WLEM - szkolenie dla warszawskich liderów edukacji medialnej"
- admin_list = ['nazwisko', 'instytucja', 'contact']
- submit_label = u'WyÅlij'
-
- nazwisko = forms.CharField(label=u'ImiÄ i nazwisko', max_length=128)
- contact = forms.CharField(label=u'Adres e-mail')
- telefon = forms.CharField(label=u'Tel. kontaktowy', max_length=32)
- instytucja = forms.CharField(label=u'Instytucja', max_length=128)
- instytucja_adres = forms.CharField(label=u'Adres (instytucji)', max_length=1024)
- stanowisko = forms.CharField(label=u'Stanowisko', max_length=256)
- doswiadczenie = forms.CharField(
- label=u'Jakie jest Pani/Pana doÅwiadczenie w zakresie edukacji medialnej?',
- widget=forms.Textarea, max_length=4096)
- dlaczego = forms.CharField(
- label=u'Dlaczego chce Pani/Pan wziÄ
Ä udziaÅ w szkoleniu?',
- widget=forms.Textarea, max_length=4096)
- cel = forms.CharField(
- label=u'JakÄ
wiedzÄ i umiejÄtnoÅci chce Pan/Pani zdobyÄ lub doskonaliÄ poprzez uczestnictwo w szkoleniu?',
- widget=forms.Textarea, max_length=4096)
- jak_wykorzystac = forms.CharField(
- label=u'Jak zamierza Pan/Pani wykorzystaÄ wiedzÄ i umiejÄtnoÅci zdobyte w czasie szkolenia?',
- widget=forms.Textarea, max_length=4096)
- zgoda_zajecia = forms.BooleanField(
- label=u'W okresie lipiec-październik 2016 r. przeprowadzÄ min. 2 godziny zajÄÄ '
- u'edukacji medialnej z grupÄ
warszawiaków.')
- zgoda_dane = forms.BooleanField(
- label=u'Wyrażam zgodÄ na przetwarzanie moich danych osobowych zawartych '
- u'w niniejszym dokumencie dla potrzeb niezbÄdnych do realizacji Projektu '
- u'âWarszawscy Liderzy Edukacji Medialnejâ zgodnie z ustawÄ
z dnia 29.08.1997 '
- u'roku o Ochronie Danych Osobowych (Dz. U. z 2002 r. Nr 101, poz. 926 '
- u'z późniejszymi zmianami).')
- zgoda_newsletter = forms.BooleanField(
- required=False,
- label=u'Wyrażam zgodÄ na otrzymywanie informacji od Fundacji Nowoczesna Polska '
- u'zwiÄ
zanych z edukacjÄ
medialnÄ
.')
-
-
-def textarea_field(label, max_length=500):
- return forms.CharField(label=label, widget=forms.Textarea, max_length=max_length)
-
-
-def ordered_textarea_field(start, pre_label=u'', label=u'', max_length=500):
- return textarea_field(
- mark_safe(u'%s- %s (max. %s znaków)
' % (
- pre_label, start, label, max_length)))
-
-
-def simple_choices(*choices):
- return tuple((choice, choice) for choice in choices)
-
-
-class CybernauciAnkietaForm(ContactForm):
- def __init__(self, *args, **kwargs):
- super(CybernauciAnkietaForm, self).__init__(*args, **kwargs)
- self.label_suffix = ''
-
- form_tag = 'cybernauci-ankieta-trenera'
- form_title = u"Cybernauci â ankieta trenerska"
- nazwisko = forms.CharField(label=u'ImiÄ i nazwisko', max_length=128)
- contact = forms.CharField(label=u'Adres e-mail')
- pyt1a = ordered_textarea_field(
- 1, pre_label=u'1. W kontekÅcie planowanego szkolenia jakie sÄ
Twoje oczekiwania w zakresie:',
- label=u'przekazywanej wiedzy')
- pyt1b = ordered_textarea_field(2, label=u'tematyki szkoleÅ z bezpieczeÅstwa w sieci')
- pyt1c = ordered_textarea_field(3, label=u'materiaÅów dydaktycznych')
- pyt1d = ordered_textarea_field(4, label=u'organizacji i prowadzenia szkoleÅ w projekcie')
- pyt1e = ordered_textarea_field(5, label=u'umiejÄtnoÅci trenerskich')
- pyt1f = ordered_textarea_field(6, label=u'inne, jakie?')
- pyt2 = textarea_field(u'2. W których tematach z obszaru bezpieczeÅstwa w sieci czujesz siÄ najpewniej? '
- u'Dlaczego? (max. 500 znaków)')
- pyt3 = textarea_field(u'3. Które z tematów znasz sÅabej lub których nie znasz zupeÅnie? (max. 500 znaków)')
- pyt4 = textarea_field(u'4. Jakie sÄ
Twoje mocne strony jako osoby prowadzÄ
cej warsztaty? (max. 500 znaków)')
- pyt5 = textarea_field(u'5. Nad jakimi elementami pracy trenerskiej chciaÅbyÅ/chciaÅabyÅ popracowaÄ? '
- u'(max. 500 znaków)')
- pyt6 = textarea_field(u'6. Co jest dla Ciebie najważniejsze w pracy z grupÄ
? '
- u'Na co zwracasz uwagÄ w tym obszarze jako osoba prowadzÄ
ca warsztaty? (max. 500 znaków)')
- pyt7 = textarea_field(u'7. Opisz najtrudniejszÄ
Twoim zdaniem sytuacjÄ, której doÅwiadczyÅeÅ/doÅwiadczyÅaÅ '
- u'podczas prowadzenia zajÄÄ w grupie z mÅodzieżÄ
, rodzicami lub nauczycielami? '
- u'(max. 500 znaków)')
- pyt8 = forms.MultipleChoiceField(
- label=u'8. W jaki sposób poradzisz sobie z niespodziewanÄ
sytuacjÄ
skrócenia czasu zajÄÄ? '
- u'Na które z poniższych punktów przeznaczysz w takiej sytuacji najmniej czasu?',
- widget=forms.CheckboxSelectMultiple,
- choices=simple_choices(
- u'Przedstawienie siÄ prowadzÄ
cych i uczestników',
- u'Poznanie oczekiwaÅ i dostosowanie do nich programu zajÄÄ',
- u'Integracja',
- u'Poprowadzenie kolejnych elementów zajÄÄ (teoria-Äwiczenia)',
- u'Podsumowanie - sprawdzenie efektów warsztatu',
- u'Zaplanowanie dalszych prac',
- u'Ewaluacja'))
- pyt8a = textarea_field(label=u'Dlaczego? (max. 1000 znaków)', max_length=1000)
- pyt9 = textarea_field(
- label=u'9. Jeden z uczestników przeszkadza podczas warsztatów: '
- u'gÅoÅno żartuje, nie wykonuje zleconych zadaÅ. Co robisz? (max. 500 znaków)')
- pyt10 = textarea_field(
- u'10. Z caÅej grupy tylko trzy osoby odpowiadajÄ
na każde zadane przez Ciebie pytanie. '
- u'Co robisz? (max. 500 znaków)')
- pyt11 = textarea_field(
- u'11. Jakie sÄ
Twoje najwiÄksze obawy wobec realizacji szkoleÅ w placówkach oÅwiatowych? (max. 500 znaków)')
- pyt12a = ordered_textarea_field(
- 1, pre_label=u'12. Opisz szczegóÅowo doÅwiadczenie z różnymi grupami:', label=u'rodzice')
- pyt12b = ordered_textarea_field(2, label=u'nauczyciele')
- pyt12c = ordered_textarea_field(3, label=u'mÅodzież ponadgimnazjalna')
- pyt12d = ordered_textarea_field(4, label=u'mÅodzież gimnazjalna')
- pyt12e = ordered_textarea_field(5, label=u'dzieci i mÅodzież szkóŠpodstawowych')
- pyt13 = textarea_field(
- u'13. Z jakimi grupami wiekowymi najlepiej Ci siÄ wspóÅpracuje? '
- u'UmiejÄtnoÅci w zakresie pracy z którÄ
grupÄ
najbardziej chciaÅabyÅ/chciaÅbyÅ zdobyÄ/doskonaliÄ? '
- u'(max. 500 znaków)')
- pyt14 = textarea_field(
- u'14. W jaki sposób na co dzieŠdbasz o swój rozwój jako trenera/trenerki, '
- u'osoby prowadzÄ
cej warsztaty czy inne formy szkoleniowe? (max. 500 znaków)')
--
2.20.1
From f9f1b488caf738a20f0a3590d89b77fb1c5c7b3d Mon Sep 17 00:00:00 2001
From: Jan Szejko
Date: Thu, 16 Nov 2017 14:29:25 +0100
Subject: [PATCH 09/16] update messages
---
wtem/templates/wtem/email_key.txt | 2 +-
wtem/templates/wtem/main_before.html | 1 +
wtem/templates/wtem/start.html | 1 +
3 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/wtem/templates/wtem/email_key.txt b/wtem/templates/wtem/email_key.txt
index 811d50b..2a6ee87 100644
--- a/wtem/templates/wtem/email_key.txt
+++ b/wtem/templates/wtem/email_key.txt
@@ -5,7 +5,7 @@ https://olimpiadacyfrowa.pl{% url 'wtem_start' submission_id=submission.id key=s
I etap Olimpiady odbÄdzie siÄ w czwartek 23 listopada o godz. 10:00 w sali wyznaczonej przez TwojÄ
KomisjÄ SzkolnÄ
. Test bÄdzie siÄ skÅadaÅ z 50 pytaÅ, które otrzymasz w losowej kolejnoÅci. Po udzieleniu odpowiedzi na dane pytanie nie ma możliwoÅci powrotu do niego i zmiany odpowiedzi. Na rozwiÄ
zanie caÅego testu bÄdziesz mieÄ 60 minut.
-Aby rozwiÄ
zaÄ test, potrzebny Ci bÄdzie komputer ze stabilnym ÅÄ
czem internetowym oraz zainstalowanÄ
i zaktualizowanÄ
przeglÄ
darkÄ
lub urzÄ
dzenie mobilne (np. telefon lub tablet) z dostÄpem do internetu.
+Aby rozwiÄ
zaÄ test, potrzebny Ci bÄdzie komputer ze stabilnym ÅÄ
czem internetowym oraz zainstalowanÄ
i zaktualizowanÄ
przeglÄ
darkÄ
lub urzÄ
dzenie mobilne (np. telefon lub tablet) z dostÄpem do internetu. Podczas rozwiÄ
zywania testu możesz korzystaÄ z internetu.
Każdy uczestnik i uczestniczka otrzymuje indywidualny link, pod którym znajdzie zadania I etapu Olimpiady Cyfrowej. Przypominamy, że zgodnie z Regulaminem, każdy zobowiÄ
zany jest do samodzielnego rozwiÄ
zania testu. Wszelkie dziaÅania ÅwiadczÄ
ce o niesamodzielnej pracy poskutkujÄ
dyskwalifikacjÄ
.
diff --git a/wtem/templates/wtem/main_before.html b/wtem/templates/wtem/main_before.html
index 77eef09..5b3cd00 100644
--- a/wtem/templates/wtem/main_before.html
+++ b/wtem/templates/wtem/main_before.html
@@ -6,6 +6,7 @@
Witamy w I etapie Olimpiady Cyfrowej.
Test skÅada z 50 pytaÅ, które otrzymasz w losowej kolejnoÅci. Po udzieleniu odpowiedzi na dane pytanie nie ma możliwoÅci powrotu do niego i zmiany odpowiedzi. Uwaga: czÄÅÄ pytaÅ ma jednÄ
, a czÄÅÄ kilka poprawnych odpowiedzi.
+Podczas rozwiÄ
zywania testu możesz korzystaÄ z internetu.
Test rozpocznie siÄ w czwartek 23 listopada o godzinie 10:00 i bÄdzie trwaÅ do godziny 11:00.
Powodzenia!
diff --git a/wtem/templates/wtem/start.html b/wtem/templates/wtem/start.html
index d0f5b4d..ff6b240 100644
--- a/wtem/templates/wtem/start.html
+++ b/wtem/templates/wtem/start.html
@@ -9,6 +9,7 @@
Test skÅada z {{ exercise_count }} pytaÅ, które otrzymasz w losowej kolejnoÅci.
Po udzieleniu odpowiedzi na dane pytanie nie ma możliwoÅci powrotu do niego i zmiany odpowiedzi.
Uwaga: czÄÅÄ pytaÅ ma jednÄ
, a czÄÅÄ kilka poprawnych odpowiedzi.
+ Podczas rozwiÄ
zywania testu możesz korzystaÄ z internetu.
Test rozpoczÄ
Å siÄ o godzinie 10:00 i trwa do godziny 11:00.
Powodzenia!
--
2.20.1
From 469775ecf6cef4426cd6a89a84889a9c007b9d01 Mon Sep 17 00:00:00 2001
From: Jan Szejko
Date: Thu, 16 Nov 2017 14:33:20 +0100
Subject: [PATCH 10/16] add option to disable contact form after given datetime
---
contact/views.py | 21 +++++++++++++++------
edumed/contact_forms.py | 2 +-
edumed/utils.py | 13 ++++++++++++-
3 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/contact/views.py b/contact/views.py
index 5a2f2ae..84578dc 100644
--- a/contact/views.py
+++ b/contact/views.py
@@ -1,28 +1,37 @@
# -*- coding: utf-8 -*-
from urllib import unquote
+from datetime import datetime
from django.contrib.auth.decorators import permission_required
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect, render
+from django.utils import timezone
+from django.views.decorators.cache import never_cache
from fnpdjango.utils.views import serve_file
from honeypot.decorators import check_honeypot
+from edumed.utils import localtime_to_utc
from .forms import contact_forms
from .models import Attachment
@check_honeypot
+@never_cache
def form(request, form_tag, force_enabled=False):
try:
form_class = contact_forms[form_tag]
except KeyError:
raise Http404
- if (getattr(form_class, 'disabled', False) and
- not (force_enabled and request.user.is_superuser)):
- template = getattr(form_class, 'disabled_template', None)
- if template:
- return render(request, template, {'title': form_class.form_title})
- raise Http404
+ if not (force_enabled and request.user.is_superuser):
+ disabled = getattr(form_class, 'disabled', False)
+ end_tuple = getattr(form_class, 'ends_on')
+ end_time = localtime_to_utc(datetime(*end_tuple)) if end_tuple else None
+ expired = end_time and end_time < timezone.now()
+ if disabled or expired:
+ template = getattr(form_class, 'disabled_template', None)
+ if template:
+ return render(request, template, {'title': form_class.form_title})
+ raise Http404
if request.method == 'POST':
form = form_class(request.POST, request.FILES)
else:
diff --git a/edumed/contact_forms.py b/edumed/contact_forms.py
index 5ee5892..e5ceff2 100644
--- a/edumed/contact_forms.py
+++ b/edumed/contact_forms.py
@@ -51,7 +51,7 @@ class CommissionForm(forms.Form):
class OlimpiadaForm(ContactForm):
- disabled = False
+ ends_on = (2017, 11, 17, 0, 5)
disabled_template = 'wtem/disabled_contact_form.html'
form_tag = "olimpiada"
form_title = u"Olimpiada Cyfrowa - Elektroniczny System ZgÅoszeÅ"
diff --git a/edumed/utils.py b/edumed/utils.py
index 2dce875..0683476 100644
--- a/edumed/utils.py
+++ b/edumed/utils.py
@@ -3,6 +3,10 @@ import codecs
import csv
import cStringIO
+import pytz
+from django.conf import settings
+from django.utils import timezone
+
from settings.apps import INSTALLED_APPS
@@ -41,4 +45,11 @@ def process_app_deps(list_with_deps):
return tuple(
(x[0] if type(x) == tuple else x)
for x in list_with_deps
- if type(x) != tuple or x[1] in INSTALLED_APPS)
\ No newline at end of file
+ if type(x) != tuple or x[1] in INSTALLED_APPS)
+
+
+def localtime_to_utc(localtime):
+ tz = pytz.timezone(settings.TIME_ZONE)
+ return timezone.utc.normalize(
+ tz.localize(localtime)
+ )
--
2.20.1
From b58642415e284ebf397f3577bfe70277e84f6993 Mon Sep 17 00:00:00 2001
From: Jan Szejko
Date: Thu, 16 Nov 2017 15:20:52 +0100
Subject: [PATCH 11/16] filter and extra column in confirmation admin
---
wtem/admin.py | 6 ++++--
wtem/models.py | 3 +++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/wtem/admin.py b/wtem/admin.py
index 4621f5f..efaf253 100644
--- a/wtem/admin.py
+++ b/wtem/admin.py
@@ -240,8 +240,10 @@ def report_view(request):
class ConfirmationAdmin(admin.ModelAdmin):
- list_display = ('email', 'first_name', 'last_name', 'readable_contact', 'readable_age', 'confirmed')
- readonly_fields = ('contact', 'readable_contact', 'readable_age', 'key', 'confirmed')
+ list_display = ('email', 'first_name', 'last_name', 'readable_contact', 'school_phone', 'readable_age', 'confirmed')
+ readonly_fields = ('contact', 'readable_contact', 'readable_age', 'school_phone', 'key', 'confirmed')
+ list_filter = ('confirmed',)
+ list_select_related = ('contact',)
def resend_mail(self, request, queryset):
for confirmation in queryset:
diff --git a/wtem/models.py b/wtem/models.py
index 390687f..5a7e221 100644
--- a/wtem/models.py
+++ b/wtem/models.py
@@ -278,6 +278,9 @@ class Confirmation(models.Model):
def readable_contact(self):
return '%s <%s>' % (self.contact.body.get('przewodniczacy'), self.contact.contact)
+ def school_phone(self):
+ return '%s, tel. %s' % (self.contact.body.get('school'), self.contact.body.get('school_phone'))
+
def age(self):
return timezone.now() - self.contact.created_at
--
2.20.1
From 334d0b5148de69b0509e001631154aa3ec788d36 Mon Sep 17 00:00:00 2001
From: Jan Szejko
Date: Thu, 16 Nov 2017 15:57:04 +0100
Subject: [PATCH 12/16] mark submissions with opened links
---
..._auto__add_field_submission_opened_link.py | 115 ++++++++++++++++++
wtem/models.py | 1 +
wtem/views.py | 5 +
3 files changed, 121 insertions(+)
create mode 100644 wtem/migrations/0012_auto__add_field_submission_opened_link.py
diff --git a/wtem/migrations/0012_auto__add_field_submission_opened_link.py b/wtem/migrations/0012_auto__add_field_submission_opened_link.py
new file mode 100644
index 0000000..14da213
--- /dev/null
+++ b/wtem/migrations/0012_auto__add_field_submission_opened_link.py
@@ -0,0 +1,115 @@
+# -*- 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 'Submission.opened_link'
+ db.add_column(u'wtem_submission', 'opened_link',
+ self.gf('django.db.models.fields.BooleanField')(default=False),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Submission.opened_link'
+ db.delete_column(u'wtem_submission', 'opened_link')
+
+
+ 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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+ 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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ u'contact.contact': {
+ 'Meta': {'ordering': "('-created_at',)", 'object_name': 'Contact'},
+ 'body': ('jsonfield.fields.JSONField', [], {}),
+ 'contact': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'form_tag': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'})
+ },
+ 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'wtem.assignment': {
+ 'Meta': {'object_name': 'Assignment'},
+ 'exercises': ('jsonfield.fields.JSONField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'unique': 'True'})
+ },
+ u'wtem.attachment': {
+ 'Meta': {'object_name': 'Attachment'},
+ 'exercise_id': ('django.db.models.fields.IntegerField', [], {}),
+ 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'submission': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['wtem.Submission']"}),
+ 'tag': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'})
+ },
+ u'wtem.competitionstate': {
+ 'Meta': {'object_name': 'CompetitionState'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'state': ('django.db.models.fields.CharField', [], {'max_length': '16'})
+ },
+ u'wtem.confirmation': {
+ 'Meta': {'ordering': "['contact__contact']", 'object_name': 'Confirmation'},
+ 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contact.Contact']", 'null': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '100'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ u'wtem.submission': {
+ 'Meta': {'object_name': 'Submission'},
+ 'answers': ('django.db.models.fields.CharField', [], {'max_length': '65536', 'null': 'True', 'blank': 'True'}),
+ 'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contact.Contact']", 'null': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '100'}),
+ 'end_time': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
+ 'examiners': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
+ 'key_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'marks': ('jsonfield.fields.JSONField', [], {'default': '{}'}),
+ 'opened_link': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'random_seed': ('django.db.models.fields.IntegerField', [], {})
+ }
+ }
+
+ complete_apps = ['wtem']
\ No newline at end of file
diff --git a/wtem/models.py b/wtem/models.py
index 5a7e221..ccbf67f 100644
--- a/wtem/models.py
+++ b/wtem/models.py
@@ -79,6 +79,7 @@ class Submission(models.Model):
email = models.EmailField(max_length=100, unique=True)
answers = models.CharField(max_length=65536, null=True, blank=True)
key_sent = models.BooleanField(default=False)
+ opened_link = models.BooleanField(default=False)
marks = JSONField(default={})
examiners = models.ManyToManyField(User, null=True, blank=True)
end_time = models.CharField(max_length=5, null=True, blank=True)
diff --git a/wtem/views.py b/wtem/views.py
index a532732..465b11b 100644
--- a/wtem/views.py
+++ b/wtem/views.py
@@ -47,6 +47,8 @@ def form_before(request, submission_id, key):
if submission.key != key:
return render(request, 'wtem/key_not_found_before.html')
else:
+ submission.opened_link = True
+ submission.save()
return render(request, 'wtem/main_before.html')
@@ -137,6 +139,9 @@ def start(request, submission_id, key):
if submission.key != key:
return render(request, 'wtem/key_not_found.html')
+ submission.opened_link = True
+ submission.save()
+
i, exercise = submission.current_exercise()
if not exercise:
return render(request, 'wtem/thanks_single.html')
--
2.20.1
From f393f3067f3d9f1e63e3076f78a78d8d779691fb Mon Sep 17 00:00:00 2001
From: Jan Szejko
Date: Fri, 17 Nov 2017 16:29:02 +0100
Subject: [PATCH 13/16] remove edumed clutter
---
api/__init__.py | 0
api/admin.py | 3 -
api/handlers.py | 62 -
api/helpers.py | 9 -
api/models.py | 3 -
api/templates/oauth/challenge.html | 0
api/templates/piston/authorize_token.html | 20 -
api/tests.py | 3 -
api/urls.py | 31 -
api/views.py | 3 -
catalogue/__init__.py | 0
catalogue/admin.py | 17 -
catalogue/forms.py | 35 -
catalogue/management/__init__.py | 0
catalogue/management/commands/__init__.py | 0
.../management/commands/importlessons.py | 144 -
catalogue/management/commands/repackage.py | 15 -
catalogue/migrations/0001_initial.py | 74 -
.../0002_auto__add_field_section_slug.py | 53 -
...__chg_field_lesson_student_package__chg.py | 81 -
..._add_field_lesson_pdf__add_field_lesson.py | 99 -
.../0005_auto__add_field_lesson_dc.py | 69 -
...__add_field_attachment_ext__add_unique_.py | 85 -
...d_lesson_type__chg_field_lesson_section.py | 96 -
.../0008_auto__del_field_lesson_depth.py | 72 -
.../0009_auto__add_field_section_xml_file.py | 73 -
catalogue/migrations/0010_auto.py | 83 -
...__chg_field_lesson_student_pdf__chg_fie.py | 127 -
.../migrations/0012_auto__add_lessonstub.py | 96 -
.../0013_auto__add_field_section_image.py | 91 -
.../0014_auto__add_field_section_summary.py | 94 -
...0015_auto__add_field_lesson_description.py | 95 -
...d_field_section_pic_attribution__add_fi.py | 114 -
catalogue/migrations/__init__.py | 0
catalogue/models.py | 317 --
catalogue/publish.py | 121 -
catalogue/search_indexes.py | 10 -
catalogue/static/catalogue/css/carousel.css | 110 -
catalogue/static/catalogue/css/carousel.scss | 140 -
catalogue/static/catalogue/css/exercise.css | 231 -
catalogue/static/catalogue/css/exercise.scss | 320 --
catalogue/static/catalogue/css/lesson.css | 254 -
catalogue/static/catalogue/css/lesson.scss | 327 --
.../static/catalogue/css/section_list.css | 58 -
.../static/catalogue/css/section_list.scss | 90 -
.../static/catalogue/img/carousel-left.png | Bin 2139 -> 0 bytes
.../static/catalogue/img/carousel-right.png | Bin 1794 -> 0 bytes
.../img/carousel/katarzyna-wlodarczyk.jpg | Bin 43105 -> 0 bytes
catalogue/static/catalogue/js/carousel.js | 27 -
catalogue/static/catalogue/js/edumed.js | 673 ---
.../static/catalogue/js/jquery.cycle.all.js | 1538 -----
catalogue/static/catalogue/js/lesson-list.js | 60 -
catalogue/static/catalogue/js/lesson.js | 12 -
.../catalogue/latest_blog_posts.html | 5 -
.../lesson/added-var/lesson_detail.html | 31 -
.../catalogue/lesson/added/lesson_detail.html | 31 -
.../lesson/appendix/lesson_detail.html | 11 -
.../templates/catalogue/lesson/box-icons.html | 18 -
.../lesson/course/lesson_detail.html | 31 -
.../catalogue/lesson/lesson_detail.html | 134 -
.../lesson/project/lesson_detail.html | 28 -
.../lesson/synthetic/lesson_detail.html | 25 -
.../templates/catalogue/lesson_list.html | 47 -
.../templates/catalogue/section_detail.html | 11 -
.../catalogue/snippets/carousel.html | 27 -
.../catalogue/snippets/lesson_link.html | 1 -
.../catalogue/snippets/lesson_nav.html | 27 -
.../catalogue/snippets/lesson_or_stub.html | 9 -
.../catalogue/snippets/level_box.html | 176 -
.../catalogue/snippets/levels_main.html | 36 -
.../search/indexes/catalogue/lesson_text.txt | 1 -
catalogue/templatetags/__init__.py | 0
catalogue/templatetags/catalogue_tags.py | 173 -
catalogue/tests.py | 17 -
catalogue/urls.py | 13 -
catalogue/views.py | 35 -
comment/__init__.py | 0
comment/admin.py | 10 -
comment/locale/pl/LC_MESSAGES/django.mo | Bin 2971 -> 0 bytes
comment/locale/pl/LC_MESSAGES/django.po | 84 -
comment/migrations/0001_initial.py | 38 -
...add_field_commentdocument_language_code.py | 34 -
comment/migrations/__init__.py | 0
comment/models.py | 20 -
.../comment/commentdocument_detail.html | 9 -
.../comment/commentdocument_list.html | 39 -
comment/urls.py | 11 -
comment/views.py | 29 -
curriculum/__init__.py | 0
curriculum/admin.py | 32 -
curriculum/fixtures/competences.json | 2951 ----------
curriculum/fixtures/curriculum.json | 567 --
curriculum/locale/pl/LC_MESSAGES/django.mo | Bin 2152 -> 0 bytes
curriculum/locale/pl/LC_MESSAGES/django.po | 131 -
curriculum/migrations/0001_initial.py | 95 -
.../0002_auto__add_field_level_group.py | 55 -
.../0003_auto__chg_field_level_slug.py | 59 -
...d_curriculumlevel__add_curriculumcourse.py | 102 -
...__add_field_curriculumcourse_accusative.py | 79 -
..._description_pl__add_field_competencele.py | 158 -
...0007_translatable_fields_data_migration.py | 92 -
..._description__del_field_section_name__d.py | 103 -
..._description_en__chg_field_competencele.py | 133 -
.../0010_auto__add_field_level_meta_name.py | 82 -
curriculum/migrations/0011_meta_name.py | 77 -
..._level_meta_name__add_unique_level_slug.py | 86 -
...ackage__add_field_level_student_package.py | 92 -
curriculum/migrations/__init__.py | 0
curriculum/models.py | 227 -
curriculum/static/curriculum/curriculum.css | 40 -
curriculum/static/curriculum/curriculum.js | 43 -
curriculum/static/curriculum/curriculum.scss | 67 -
.../curriculum/competence_detail.html | 13 -
.../templates/curriculum/competence_list.html | 73 -
.../curriculum/snippets/competence.html | 12 -
.../curriculum/snippets/course_box.html | 35 -
.../curriculum/snippets/course_boxes.html | 8 -
.../curriculum/snippets/course_boxes_toc.html | 14 -
.../curriculum/snippets/curriculum.html | 17 -
curriculum/templatetags/__init__.py | 0
curriculum/templatetags/curriculum_tags.py | 96 -
curriculum/tests.py | 17 -
curriculum/urls.py | 9 -
curriculum/views.py | 66 -
edumed/context_processors.py | 4 -
edumed/forms.py | 17 -
edumed/forum.py | 25 -
edumed/locale-contrib/django.pot | 715 ---
.../locale-contrib/pl/LC_MESSAGES/django.mo | Bin 1685 -> 0 bytes
.../locale-contrib/pl/LC_MESSAGES/django.po | 677 ---
edumed/milurls.py | 28 -
edumed/settings/apps.py | 8 -
edumed/settings/context.py | 2 -
edumed/settings/contrib.py | 8 -
edumed/settings/custom.py | 2 +-
edumed/settings/locale.py | 1 -
edumed/settings/middleware.py | 2 -
edumed/settings/static.py | 16 +-
edumed/static/catalogue/css/carousel.css | 110 -
edumed/static/catalogue/css/carousel.scss | 140 -
edumed/static/catalogue/css/lesson.css | 254 -
edumed/static/catalogue/css/lesson.scss | 327 --
edumed/static/catalogue/css/section_list.css | 58 -
edumed/static/catalogue/css/section_list.scss | 90 -
edumed/static/catalogue/img/carousel-left.png | Bin 2139 -> 0 bytes
.../static/catalogue/img/carousel-right.png | Bin 1794 -> 0 bytes
.../img/carousel/katarzyna-wlodarczyk.jpg | Bin 43105 -> 0 bytes
edumed/static/catalogue/js/carousel.js | 27 -
.../catalogue/js/jquery-ui-1.10.0.custom.js | 5027 -----------------
.../static/catalogue/js/jquery.cycle.all.js | 1538 -----
edumed/static/catalogue/js/lesson-list.js | 60 -
edumed/static/catalogue/js/lesson.js | 12 -
edumed/static/css/base.css | 42 -
edumed/static/css/base.scss | 14 -
edumed/static/css/forum.css | 89 -
edumed/static/css/forum.scss | 180 -
edumed/static/css/mil.css | 47 -
edumed/static/css/mil.scss | 57 -
edumed/static/css/promobox.css | 0
edumed/static/css/promobox.scss | 9 -
edumed/static/img/logo-mil.png | Bin 11893 -> 0 bytes
edumed/static/img/logo.png | Bin 3020 -> 0 bytes
edumed/static/img/logo_fnp_white.png | Bin 1674 -> 0 bytes
edumed/static/img/menu/katalog.png | Bin 885 -> 0 bytes
edumed/static/img/menu/katalog_active.png | Bin 874 -> 0 bytes
edumed/static/img/menu/kontakt.png | Bin 481 -> 0 bytes
edumed/static/img/menu/kontakt_active.png | Bin 470 -> 0 bytes
edumed/static/img/menu/lekcje.png | Bin 804 -> 0 bytes
edumed/static/img/menu/lekcje_active.png | Bin 791 -> 0 bytes
edumed/static/img/menu/mil/catalog.png | Bin 606 -> 0 bytes
edumed/static/img/menu/mil/consultations.png | Bin 624 -> 0 bytes
edumed/static/img/menu/mil/contact.png | Bin 404 -> 0 bytes
edumed/static/img/menu/mil/knowledgebase.png | Bin 777 -> 0 bytes
edumed/static/img/menu/mil/lang_en.png | Bin 1175 -> 0 bytes
edumed/static/img/menu/mil/lang_pl.png | Bin 361 -> 0 bytes
edumed/static/img/menu/mil/takepart.png | Bin 523 -> 0 bytes
edumed/static/img/menu/o-nas.png | Bin 681 -> 0 bytes
edumed/static/img/menu/o-nas_active.png | Bin 679 -> 0 bytes
edumed/static/img/menu/szkolenia.png | Bin 743 -> 0 bytes
edumed/static/img/menu/szkolenia_active.png | Bin 739 -> 0 bytes
edumed/static/img/menu/wesprzyj.png | Bin 753 -> 0 bytes
edumed/static/img/menu/wesprzyj_active.png | Bin 755 -> 0 bytes
edumed/static/img/menu/wspolpraca.png | Bin 635 -> 0 bytes
edumed/static/img/menu/wspolpraca_active.png | Bin 634 -> 0 bytes
edumed/static/img/nina-white.png | Bin 2792 -> 0 bytes
edumed/static/img/nina.jpg | Bin 3768 -> 0 bytes
.../static}/js/jquery-ui-1.10.0.custom.js | 0
edumed/templates/404_mil.html | 14 -
edumed/templates/base_forum.html | 10 -
edumed/templates/base_mil.html | 38 -
.../templates/contact/konkurs/mail_body.txt | 15 -
.../contact/konkurs/mail_subject.txt | 1 -
edumed/templates/contact/konkurs/thanks.html | 13 -
.../templates/contact/sugestie/mail_body.txt | 10 -
.../contact/sugestie/mail_subject.txt | 1 -
edumed/templates/contact/sugestie/thanks.html | 5 -
edumed/templates/contact/tem/mail_body.txt | 8 -
edumed/templates/contact/tem/mail_subject.txt | 1 -
edumed/templates/contact/tem/thanks.html | 7 -
.../contact/wspolpraca/mail_body.txt | 9 -
.../contact/wspolpraca/mail_subject.txt | 1 -
.../templates/contact/wspolpraca/thanks.html | 5 -
edumed/templates/contact/wtem/form.html | 71 -
edumed/templates/contact/wtem/mail_body.txt | 19 -
.../templates/contact/wtem/mail_subject.txt | 1 -
.../contact/wtem/student_mail_body.html | 17 -
.../contact/wtem/student_mail_subject.html | 1 -
edumed/templates/contact/wtem/thanks.html | 15 -
edumed/templates/flatpages/mil.html | 10 -
edumed/templates/home.html | 70 -
edumed/templates/home_mil.html | 5 -
edumed/templates/olimpiada_teaser.html | 45 -
.../pybb/_need_to_login_message.html | 2 -
edumed/templates/pybb/avatar.html | 8 -
edumed/templates/pybb/breadcrumb.html | 20 -
.../pybb/breadcrumb_top_extra_crumb.html | 1 -
edumed/urls.py | 52 +-
edumed/views.py | 36 +-
forum/__init__.py | 0
forum/forms.py | 41 -
forum/locale/pl/LC_MESSAGES/django.mo | Bin 536 -> 0 bytes
forum/locale/pl/LC_MESSAGES/django.po | 60 -
forum/middleware.py | 16 -
forum/migrations/0001_initial.py | 164 -
forum/migrations/__init__.py | 0
forum/models.py | 11 -
forum/search_indexes.py | 10 -
.../templates/forum/related_lesson_info.html | 4 -
forum/templates/forum/search_results.html | 41 -
forum/templates/pybb/category.html | 47 -
.../pybb/forum_last_update_info.html | 5 -
forum/templates/pybb/post_form.html | 36 -
forum/templates/pybb/topic.html | 102 -
.../pybb/topic_last_message_info.html | 6 -
.../search/indexes/pybb/post_text.txt | 1 -
forum/urls.py | 26 -
forum/views.py | 58 -
lib/librarian | 1 -
publishers/__init__.py | 0
publishers/admin.py | 5 -
publishers/migrations/0001_initial.py | 34 -
publishers/migrations/__init__.py | 0
publishers/models.py | 10 -
requirements.txt | 1 -
244 files changed, 20 insertions(+), 23583 deletions(-)
delete mode 100644 api/__init__.py
delete mode 100644 api/admin.py
delete mode 100644 api/handlers.py
delete mode 100644 api/helpers.py
delete mode 100644 api/models.py
delete mode 100644 api/templates/oauth/challenge.html
delete mode 100644 api/templates/piston/authorize_token.html
delete mode 100644 api/tests.py
delete mode 100644 api/urls.py
delete mode 100644 api/views.py
delete mode 100644 catalogue/__init__.py
delete mode 100755 catalogue/admin.py
delete mode 100644 catalogue/forms.py
delete mode 100755 catalogue/management/__init__.py
delete mode 100755 catalogue/management/commands/__init__.py
delete mode 100755 catalogue/management/commands/importlessons.py
delete mode 100755 catalogue/management/commands/repackage.py
delete mode 100644 catalogue/migrations/0001_initial.py
delete mode 100644 catalogue/migrations/0002_auto__add_field_section_slug.py
delete mode 100644 catalogue/migrations/0003_auto__chg_field_lesson_xml_file__chg_field_lesson_student_package__chg.py
delete mode 100644 catalogue/migrations/0004_auto__add_part__add_attachment__add_field_lesson_pdf__add_field_lesson.py
delete mode 100644 catalogue/migrations/0005_auto__add_field_lesson_dc.py
delete mode 100644 catalogue/migrations/0006_auto__add_field_attachment_slug__add_field_attachment_ext__add_unique_.py
delete mode 100644 catalogue/migrations/0007_auto__add_field_lesson_type__chg_field_lesson_section.py
delete mode 100644 catalogue/migrations/0008_auto__del_field_lesson_depth.py
delete mode 100644 catalogue/migrations/0009_auto__add_field_section_xml_file.py
delete mode 100644 catalogue/migrations/0010_auto.py
delete mode 100644 catalogue/migrations/0011_auto__chg_field_lesson_xml_file__chg_field_lesson_student_pdf__chg_fie.py
delete mode 100644 catalogue/migrations/0012_auto__add_lessonstub.py
delete mode 100644 catalogue/migrations/0013_auto__add_field_section_image.py
delete mode 100644 catalogue/migrations/0014_auto__add_field_section_summary.py
delete mode 100644 catalogue/migrations/0015_auto__add_field_lesson_description.py
delete mode 100644 catalogue/migrations/0016_auto__add_field_section_pic__add_field_section_pic_attribution__add_fi.py
delete mode 100644 catalogue/migrations/__init__.py
delete mode 100644 catalogue/models.py
delete mode 100755 catalogue/publish.py
delete mode 100755 catalogue/search_indexes.py
delete mode 100644 catalogue/static/catalogue/css/carousel.css
delete mode 100755 catalogue/static/catalogue/css/carousel.scss
delete mode 100644 catalogue/static/catalogue/css/exercise.css
delete mode 100755 catalogue/static/catalogue/css/exercise.scss
delete mode 100644 catalogue/static/catalogue/css/lesson.css
delete mode 100755 catalogue/static/catalogue/css/lesson.scss
delete mode 100644 catalogue/static/catalogue/css/section_list.css
delete mode 100755 catalogue/static/catalogue/css/section_list.scss
delete mode 100644 catalogue/static/catalogue/img/carousel-left.png
delete mode 100644 catalogue/static/catalogue/img/carousel-right.png
delete mode 100644 catalogue/static/catalogue/img/carousel/katarzyna-wlodarczyk.jpg
delete mode 100755 catalogue/static/catalogue/js/carousel.js
delete mode 100644 catalogue/static/catalogue/js/edumed.js
delete mode 100644 catalogue/static/catalogue/js/jquery.cycle.all.js
delete mode 100644 catalogue/static/catalogue/js/lesson-list.js
delete mode 100755 catalogue/static/catalogue/js/lesson.js
delete mode 100755 catalogue/templates/catalogue/latest_blog_posts.html
delete mode 100644 catalogue/templates/catalogue/lesson/added-var/lesson_detail.html
delete mode 100644 catalogue/templates/catalogue/lesson/added/lesson_detail.html
delete mode 100755 catalogue/templates/catalogue/lesson/appendix/lesson_detail.html
delete mode 100644 catalogue/templates/catalogue/lesson/box-icons.html
delete mode 100755 catalogue/templates/catalogue/lesson/course/lesson_detail.html
delete mode 100755 catalogue/templates/catalogue/lesson/lesson_detail.html
delete mode 100755 catalogue/templates/catalogue/lesson/project/lesson_detail.html
delete mode 100755 catalogue/templates/catalogue/lesson/synthetic/lesson_detail.html
delete mode 100755 catalogue/templates/catalogue/lesson_list.html
delete mode 100755 catalogue/templates/catalogue/section_detail.html
delete mode 100755 catalogue/templates/catalogue/snippets/carousel.html
delete mode 100755 catalogue/templates/catalogue/snippets/lesson_link.html
delete mode 100755 catalogue/templates/catalogue/snippets/lesson_nav.html
delete mode 100644 catalogue/templates/catalogue/snippets/lesson_or_stub.html
delete mode 100755 catalogue/templates/catalogue/snippets/level_box.html
delete mode 100644 catalogue/templates/catalogue/snippets/levels_main.html
delete mode 100755 catalogue/templates/search/indexes/catalogue/lesson_text.txt
delete mode 100755 catalogue/templatetags/__init__.py
delete mode 100755 catalogue/templatetags/catalogue_tags.py
delete mode 100644 catalogue/tests.py
delete mode 100755 catalogue/urls.py
delete mode 100644 catalogue/views.py
delete mode 100644 comment/__init__.py
delete mode 100644 comment/admin.py
delete mode 100644 comment/locale/pl/LC_MESSAGES/django.mo
delete mode 100644 comment/locale/pl/LC_MESSAGES/django.po
delete mode 100644 comment/migrations/0001_initial.py
delete mode 100644 comment/migrations/0002_auto__add_field_commentdocument_language_code.py
delete mode 100644 comment/migrations/__init__.py
delete mode 100644 comment/models.py
delete mode 100644 comment/templates/comment/commentdocument_detail.html
delete mode 100644 comment/templates/comment/commentdocument_list.html
delete mode 100644 comment/urls.py
delete mode 100644 comment/views.py
delete mode 100644 curriculum/__init__.py
delete mode 100755 curriculum/admin.py
delete mode 100644 curriculum/fixtures/competences.json
delete mode 100644 curriculum/fixtures/curriculum.json
delete mode 100644 curriculum/locale/pl/LC_MESSAGES/django.mo
delete mode 100644 curriculum/locale/pl/LC_MESSAGES/django.po
delete mode 100644 curriculum/migrations/0001_initial.py
delete mode 100644 curriculum/migrations/0002_auto__add_field_level_group.py
delete mode 100644 curriculum/migrations/0003_auto__chg_field_level_slug.py
delete mode 100644 curriculum/migrations/0004_auto__add_curriculum__add_curriculumlevel__add_curriculumcourse.py
delete mode 100644 curriculum/migrations/0005_auto__add_field_curriculumcourse_accusative.py
delete mode 100644 curriculum/migrations/0006_auto__add_field_competencelevel_description_pl__add_field_competencele.py
delete mode 100644 curriculum/migrations/0007_translatable_fields_data_migration.py
delete mode 100644 curriculum/migrations/0008_auto__del_field_competencelevel_description__del_field_section_name__d.py
delete mode 100644 curriculum/migrations/0009_auto__chg_field_competencelevel_description_en__chg_field_competencele.py
delete mode 100644 curriculum/migrations/0010_auto__add_field_level_meta_name.py
delete mode 100644 curriculum/migrations/0011_meta_name.py
delete mode 100644 curriculum/migrations/0012_auto__add_unique_level_meta_name__add_unique_level_slug.py
delete mode 100644 curriculum/migrations/0013_auto__add_field_level_package__add_field_level_student_package.py
delete mode 100644 curriculum/migrations/__init__.py
delete mode 100644 curriculum/models.py
delete mode 100644 curriculum/static/curriculum/curriculum.css
delete mode 100755 curriculum/static/curriculum/curriculum.js
delete mode 100755 curriculum/static/curriculum/curriculum.scss
delete mode 100755 curriculum/templates/curriculum/competence_detail.html
delete mode 100755 curriculum/templates/curriculum/competence_list.html
delete mode 100755 curriculum/templates/curriculum/snippets/competence.html
delete mode 100755 curriculum/templates/curriculum/snippets/course_box.html
delete mode 100755 curriculum/templates/curriculum/snippets/course_boxes.html
delete mode 100755 curriculum/templates/curriculum/snippets/course_boxes_toc.html
delete mode 100755 curriculum/templates/curriculum/snippets/curriculum.html
delete mode 100755 curriculum/templatetags/__init__.py
delete mode 100755 curriculum/templatetags/curriculum_tags.py
delete mode 100644 curriculum/tests.py
delete mode 100755 curriculum/urls.py
delete mode 100644 curriculum/views.py
delete mode 100644 edumed/context_processors.py
delete mode 100644 edumed/forms.py
delete mode 100644 edumed/forum.py
delete mode 100644 edumed/locale-contrib/django.pot
delete mode 100644 edumed/locale-contrib/pl/LC_MESSAGES/django.mo
delete mode 100644 edumed/locale-contrib/pl/LC_MESSAGES/django.po
delete mode 100644 edumed/milurls.py
delete mode 100644 edumed/static/catalogue/css/carousel.css
delete mode 100755 edumed/static/catalogue/css/carousel.scss
delete mode 100644 edumed/static/catalogue/css/lesson.css
delete mode 100755 edumed/static/catalogue/css/lesson.scss
delete mode 100644 edumed/static/catalogue/css/section_list.css
delete mode 100755 edumed/static/catalogue/css/section_list.scss
delete mode 100644 edumed/static/catalogue/img/carousel-left.png
delete mode 100644 edumed/static/catalogue/img/carousel-right.png
delete mode 100644 edumed/static/catalogue/img/carousel/katarzyna-wlodarczyk.jpg
delete mode 100755 edumed/static/catalogue/js/carousel.js
delete mode 100644 edumed/static/catalogue/js/jquery-ui-1.10.0.custom.js
delete mode 100644 edumed/static/catalogue/js/jquery.cycle.all.js
delete mode 100644 edumed/static/catalogue/js/lesson-list.js
delete mode 100755 edumed/static/catalogue/js/lesson.js
delete mode 100644 edumed/static/css/forum.css
delete mode 100755 edumed/static/css/forum.scss
delete mode 100644 edumed/static/css/mil.css
delete mode 100644 edumed/static/css/mil.scss
delete mode 100644 edumed/static/css/promobox.css
delete mode 100755 edumed/static/css/promobox.scss
delete mode 100644 edumed/static/img/logo-mil.png
delete mode 100644 edumed/static/img/logo.png
delete mode 100644 edumed/static/img/logo_fnp_white.png
delete mode 100644 edumed/static/img/menu/katalog.png
delete mode 100644 edumed/static/img/menu/katalog_active.png
delete mode 100644 edumed/static/img/menu/kontakt.png
delete mode 100644 edumed/static/img/menu/kontakt_active.png
delete mode 100644 edumed/static/img/menu/lekcje.png
delete mode 100644 edumed/static/img/menu/lekcje_active.png
delete mode 100644 edumed/static/img/menu/mil/catalog.png
delete mode 100644 edumed/static/img/menu/mil/consultations.png
delete mode 100644 edumed/static/img/menu/mil/contact.png
delete mode 100644 edumed/static/img/menu/mil/knowledgebase.png
delete mode 100644 edumed/static/img/menu/mil/lang_en.png
delete mode 100644 edumed/static/img/menu/mil/lang_pl.png
delete mode 100644 edumed/static/img/menu/mil/takepart.png
delete mode 100644 edumed/static/img/menu/o-nas.png
delete mode 100644 edumed/static/img/menu/o-nas_active.png
delete mode 100644 edumed/static/img/menu/szkolenia.png
delete mode 100644 edumed/static/img/menu/szkolenia_active.png
delete mode 100644 edumed/static/img/menu/wesprzyj.png
delete mode 100644 edumed/static/img/menu/wesprzyj_active.png
delete mode 100644 edumed/static/img/menu/wspolpraca.png
delete mode 100644 edumed/static/img/menu/wspolpraca_active.png
delete mode 100644 edumed/static/img/nina-white.png
delete mode 100644 edumed/static/img/nina.jpg
rename {catalogue/static/catalogue => edumed/static}/js/jquery-ui-1.10.0.custom.js (100%)
delete mode 100644 edumed/templates/404_mil.html
delete mode 100755 edumed/templates/base_forum.html
delete mode 100644 edumed/templates/base_mil.html
delete mode 100644 edumed/templates/contact/konkurs/mail_body.txt
delete mode 100644 edumed/templates/contact/konkurs/mail_subject.txt
delete mode 100644 edumed/templates/contact/konkurs/thanks.html
delete mode 100644 edumed/templates/contact/sugestie/mail_body.txt
delete mode 100644 edumed/templates/contact/sugestie/mail_subject.txt
delete mode 100644 edumed/templates/contact/sugestie/thanks.html
delete mode 100755 edumed/templates/contact/tem/mail_body.txt
delete mode 100755 edumed/templates/contact/tem/mail_subject.txt
delete mode 100755 edumed/templates/contact/tem/thanks.html
delete mode 100644 edumed/templates/contact/wspolpraca/mail_body.txt
delete mode 100644 edumed/templates/contact/wspolpraca/mail_subject.txt
delete mode 100644 edumed/templates/contact/wspolpraca/thanks.html
delete mode 100755 edumed/templates/contact/wtem/form.html
delete mode 100755 edumed/templates/contact/wtem/mail_body.txt
delete mode 100755 edumed/templates/contact/wtem/mail_subject.txt
delete mode 100644 edumed/templates/contact/wtem/student_mail_body.html
delete mode 100644 edumed/templates/contact/wtem/student_mail_subject.html
delete mode 100755 edumed/templates/contact/wtem/thanks.html
delete mode 100644 edumed/templates/flatpages/mil.html
delete mode 100755 edumed/templates/home.html
delete mode 100644 edumed/templates/home_mil.html
delete mode 100644 edumed/templates/olimpiada_teaser.html
delete mode 100755 edumed/templates/pybb/_need_to_login_message.html
delete mode 100755 edumed/templates/pybb/avatar.html
delete mode 100755 edumed/templates/pybb/breadcrumb.html
delete mode 100755 edumed/templates/pybb/breadcrumb_top_extra_crumb.html
delete mode 100644 forum/__init__.py
delete mode 100644 forum/forms.py
delete mode 100644 forum/locale/pl/LC_MESSAGES/django.mo
delete mode 100644 forum/locale/pl/LC_MESSAGES/django.po
delete mode 100644 forum/middleware.py
delete mode 100644 forum/migrations/0001_initial.py
delete mode 100644 forum/migrations/__init__.py
delete mode 100644 forum/models.py
delete mode 100644 forum/search_indexes.py
delete mode 100644 forum/templates/forum/related_lesson_info.html
delete mode 100644 forum/templates/forum/search_results.html
delete mode 100644 forum/templates/pybb/category.html
delete mode 100644 forum/templates/pybb/forum_last_update_info.html
delete mode 100644 forum/templates/pybb/post_form.html
delete mode 100644 forum/templates/pybb/topic.html
delete mode 100644 forum/templates/pybb/topic_last_message_info.html
delete mode 100644 forum/templates/search/indexes/pybb/post_text.txt
delete mode 100644 forum/urls.py
delete mode 100644 forum/views.py
delete mode 160000 lib/librarian
delete mode 100644 publishers/__init__.py
delete mode 100644 publishers/admin.py
delete mode 100644 publishers/migrations/0001_initial.py
delete mode 100644 publishers/migrations/__init__.py
delete mode 100644 publishers/models.py
diff --git a/api/__init__.py b/api/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/api/admin.py b/api/admin.py
deleted file mode 100644
index 8c38f3f..0000000
--- a/api/admin.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.contrib import admin
-
-# Register your models here.
diff --git a/api/handlers.py b/api/handlers.py
deleted file mode 100644
index 5746b0c..0000000
--- a/api/handlers.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# -*- coding: utf-8 -*-
-import json
-
-from django.contrib.sites.models import Site
-from django.core.urlresolvers import reverse
-from django.utils.functional import lazy
-from piston.handler import BaseHandler
-from piston.utils import rc
-
-from catalogue.forms import LessonImportForm
-from catalogue.models import Lesson
-
-API_BASE = EDUMED_BASE = MEDIA_BASE = lazy(
- lambda: u'https://' + Site.objects.get_current().domain, unicode)()
-
-
-class LessonDetails(object):
- """Custom fields used for representing Lessons."""
-
- @classmethod
- def href(cls, lesson):
- """ Returns an URI for a Lesson in the API. """
- return API_BASE + reverse("api_lesson", args=[lesson.slug])
-
- @classmethod
- def url(cls, lesson):
- """ Returns Lesson's URL on the site. """
- return EDUMED_BASE + lesson.get_absolute_url()
-
-
-class LessonDetailHandler(BaseHandler, LessonDetails):
- """ Main handler for Lesson objects.
-
- Responsible for single Lesson details.
- """
- allowed_methods = ['GET']
- fields = ['title', 'url']
-
- def read(self, request, lesson):
- """ Returns details of a lesson, identified by a slug. """
- try:
- return Lesson.objects.get(slug=lesson)
- except Lesson.DoesNotExist:
- return rc.NOT_FOUND
-
-
-class LessonsHandler(LessonDetailHandler):
- allowed_methods = ('GET', 'POST')
- model = Lesson
- fields = ['href', 'title', 'url']
-
- def create(self, request, *args, **kwargs):
- if not request.user.has_perm('catalogue.add_lesson'):
- return rc.FORBIDDEN
-
- data = json.loads(request.POST.get('data'))
- form = LessonImportForm(data)
- if form.is_valid():
- form.save()
- return rc.CREATED
- else:
- return rc.NOT_FOUND
diff --git a/api/helpers.py b/api/helpers.py
deleted file mode 100644
index a40373a..0000000
--- a/api/helpers.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-from piston.resource import Resource
-
-
-class CsrfExemptResource(Resource):
- """A Custom Resource that is csrf exempt"""
- def __init__(self, handler, authentication=None):
- super(CsrfExemptResource, self).__init__(handler, authentication)
- self.csrf_exempt = getattr(self.handler, 'csrf_exempt', True)
\ No newline at end of file
diff --git a/api/models.py b/api/models.py
deleted file mode 100644
index 71a8362..0000000
--- a/api/models.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.db import models
-
-# Create your models here.
diff --git a/api/templates/oauth/challenge.html b/api/templates/oauth/challenge.html
deleted file mode 100644
index e69de29..0000000
diff --git a/api/templates/piston/authorize_token.html b/api/templates/piston/authorize_token.html
deleted file mode 100644
index 0151b58..0000000
--- a/api/templates/piston/authorize_token.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{% extends "base.html" %}
-{% load i18n %}
-
-{% block titleextra %}Zezwól na dostÄp do Edukacji Medialnej{% endblock %}
-
-{% block body %}
- Zezwól na dostÄp do Edukacji Medialnej
-
-
-
- Potwierdź dostÄp do Edukacji Medialnej jako użytkownik {{ user }}.
-
-
-
-
-{% endblock %}
diff --git a/api/tests.py b/api/tests.py
deleted file mode 100644
index 7ce503c..0000000
--- a/api/tests.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/api/urls.py b/api/urls.py
deleted file mode 100644
index a111872..0000000
--- a/api/urls.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-from django.conf.urls import patterns, url
-from django.views.decorators.csrf import csrf_exempt
-from piston.authentication import OAuthAuthentication, oauth_access_token
-from piston.resource import Resource
-
-from api import handlers
-from api.helpers import CsrfExemptResource
-
-auth = OAuthAuthentication(realm="Edukacja Medialna")
-
-lesson_list_resource = CsrfExemptResource(handler=handlers.LessonsHandler, authentication=auth)
-lesson_resource = Resource(handler=handlers.LessonDetailHandler)
-
-urlpatterns = patterns(
- 'piston.authentication',
- url(r'^oauth/request_token/$', 'oauth_request_token'),
- url(r'^oauth/authorize/$', 'oauth_user_auth'),
- url(r'^oauth/access_token/$', csrf_exempt(oauth_access_token)),
-)
-
-urlpatterns += patterns(
- '',
- # url(r'^$', TemplateView.as_view(template_name='api/main.html'), name='api'),
-
- # objects details
- url(r'^lessons/(?P[a-z0-9-]+)/$', lesson_resource, name="api_lesson"),
-
- # lessons
- url(r'^lessons/$', lesson_list_resource, name='api_lesson_list'),
-)
diff --git a/api/views.py b/api/views.py
deleted file mode 100644
index 91ea44a..0000000
--- a/api/views.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.shortcuts import render
-
-# Create your views here.
diff --git a/catalogue/__init__.py b/catalogue/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/catalogue/admin.py b/catalogue/admin.py
deleted file mode 100755
index 8256d66..0000000
--- a/catalogue/admin.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# -*- coding: utf-8 -*-
-from django.contrib import admin
-from .models import Attachment, Section, Lesson, LessonStub
-
-
-class AttachmentInline(admin.TabularInline):
- model = Attachment
-
-
-class LessonAdmin(admin.ModelAdmin):
- inlines = [AttachmentInline]
- list_display = ['title', 'section', 'type']
- list_filter = ['level', 'type']
-
-admin.site.register(Section)
-admin.site.register(Lesson, LessonAdmin)
-admin.site.register(LessonStub)
diff --git a/catalogue/forms.py b/catalogue/forms.py
deleted file mode 100644
index 7230b23..0000000
--- a/catalogue/forms.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# -*- coding: utf-8 -*-
-import json
-import os.path
-import shutil
-import urllib
-from tempfile import mkdtemp
-
-from django.forms import Form, CharField
-
-from librarian import IOFile
-from catalogue.models import Lesson
-
-
-class LessonImportForm(Form):
- lesson_xml = CharField()
- gallery_url = CharField(required=False)
- attachments = CharField(required=False)
-
- def save(self):
- temp_dir = mkdtemp()
- attachment_names = json.loads(self.cleaned_data['attachments'])
- attachments = {}
- remote_gallery_url = self.cleaned_data['gallery_url']
- if remote_gallery_url and attachment_names:
- for attachment_name in attachment_names:
- attachment_url = ('%s%s' % (remote_gallery_url, attachment_name)).encode('utf-8')
- temp_filename = os.path.join(temp_dir, attachment_name)
- urllib.urlretrieve(attachment_url, temp_filename)
- attachments[attachment_name] = IOFile.from_filename(temp_filename)
-
- lesson = Lesson.publish(
- IOFile.from_string(self.cleaned_data['lesson_xml'], attachments=attachments))
- if os.path.isdir(temp_dir):
- shutil.rmtree(temp_dir)
- return lesson
diff --git a/catalogue/management/__init__.py b/catalogue/management/__init__.py
deleted file mode 100755
index e69de29..0000000
diff --git a/catalogue/management/commands/__init__.py b/catalogue/management/commands/__init__.py
deleted file mode 100755
index e69de29..0000000
diff --git a/catalogue/management/commands/importlessons.py b/catalogue/management/commands/importlessons.py
deleted file mode 100755
index d4733d3..0000000
--- a/catalogue/management/commands/importlessons.py
+++ /dev/null
@@ -1,144 +0,0 @@
-# -*- coding: utf-8 -*-
-# This file is part of EduMed, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
-#
-import os
-import sys
-from optparse import make_option
-
-from django.core.management.base import BaseCommand
-from django.db import transaction
-
-from catalogue.models import Lesson, Section
-from librarian import IOFile
-
-
-class Command(BaseCommand):
- option_list = BaseCommand.option_list + (
- make_option('-q', '--quiet', action='store_false', dest='verbose', default=True,
- help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
- make_option('-a', '--attachments', dest='attachments', metavar="PATH", default='materialy',
- help='Attachments dir path.'),
- make_option('--ignore-incomplete', action='store_true', dest='ignore_incomplete', default=False,
- help='Attachments dir path.'),
- )
- help = 'Imports lessons from the specified directories.'
- args = 'directory [directory ...]'
-
- def __init__(self):
- super(Command, self).__init__()
- self.options = None
- self.levels = None
-
- @staticmethod
- def all_attachments(path):
- files = {}
- if not os.path.isdir(path):
- return files
-
- def read_dir(path):
- for name in os.listdir(path):
- fullname = os.path.join(path, name)
- if os.path.isdir(fullname):
- read_dir(fullname)
- else:
- f = IOFile.from_filename(fullname)
- files[name.decode('utf-8')] = f
- files.setdefault(name.replace(" ", "").decode('utf-8'), f)
-
- read_dir(path)
- return files
-
- @transaction.atomic
- def handle(self, *directories, **options):
-
- self.levels = set()
-
- curdir = os.path.abspath(os.curdir)
- self.options = options
-
- files_imported = 0
- files_skipped = 0
-
- for dir_name in directories:
- abs_dir = os.path.join(curdir, dir_name)
- if not os.path.isdir(abs_dir):
- print self.style.ERROR("%s: Not a directory. Skipping." % abs_dir)
- else:
- files_imported_dir, files_skipped_dir = self.import_from_dir(abs_dir)
- files_imported += files_imported_dir
- files_skipped += files_skipped_dir
-
- if self.levels:
- print "Rebuilding level packages:"
- for level in self.levels:
- print level.name
- level.build_packages()
-
- # Print results
- print
- print "Results: %d files imported, %d skipped, %d total." % (
- files_imported, files_skipped, files_imported + files_skipped)
- print
-
- def import_from_dir(self, abs_dir):
- verbose = self.options.get('verbose')
- files_imported = 0
- files_skipped = 0
- att_dir = os.path.join(abs_dir, self.options['attachments'])
- attachments = self.all_attachments(att_dir)
- # files queue
- files = sorted(os.listdir(abs_dir))
- postponed = {}
- ignore_incomplete = set()
- while files:
- file_name = files.pop(0)
- file_path = os.path.join(abs_dir, file_name)
- file_base, ext = os.path.splitext(file_path)
-
- if os.path.isdir(file_path):
- dir_imported, dir_skipped = self.import_from_dir(file_path)
- files_imported += dir_imported
- files_skipped += files_skipped
- continue
-
- # Skip files that are not XML files
- if not ext == '.xml':
- continue
-
- if verbose > 0:
- print "Parsing '%s'" % file_path
- else:
- sys.stdout.write('.')
- sys.stdout.flush()
-
- try:
- iofile = IOFile.from_filename(file_path)
- iofile.attachments = attachments
- lesson = Lesson.publish(iofile, file_name in ignore_incomplete)
- except Section.IncompleteError:
- if file_name not in postponed or postponed[file_name] < files_imported:
- # Push it back into the queue, maybe the missing lessons will show up.
- if verbose > 0:
- print self.style.NOTICE('Waiting for missing lessons.')
- files.append(file_name)
- postponed[file_name] = files_imported
- elif self.options['ignore_incomplete'] and file_name not in ignore_incomplete:
- files.append(file_name)
- ignore_incomplete.add(file_name)
- postponed[file_name] = files_imported
- else:
- # We're in a loop, nothing's being imported - some lesson is really missing.
- raise
- except BaseException:
- import traceback
- traceback.print_exc()
- files_skipped += 1
- else:
- files_imported += 1
- if hasattr(lesson, 'level'):
- self.levels.add(lesson.level)
- finally:
- if verbose > 0:
- print
- return files_imported, files_skipped
diff --git a/catalogue/management/commands/repackage.py b/catalogue/management/commands/repackage.py
deleted file mode 100755
index a2851f6..0000000
--- a/catalogue/management/commands/repackage.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-# This file is part of EduMed, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
-#
-from django.core.management.base import BaseCommand
-
-
-class Command(BaseCommand):
- help = 'Rebuilds downloadable packages.'
-
- def handle(self, **options):
- from curriculum.models import Level
-
- for level in Level.objects.all():
- level.build_packages()
diff --git a/catalogue/migrations/0001_initial.py b/catalogue/migrations/0001_initial.py
deleted file mode 100644
index 846c559..0000000
--- a/catalogue/migrations/0001_initial.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# -*- 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 'Section'
- db.create_table('catalogue_section', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
- ('order', self.gf('django.db.models.fields.IntegerField')()),
- ))
- db.send_create_signal('catalogue', ['Section'])
-
- # Adding model 'Lesson'
- db.create_table('catalogue_lesson', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('section', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Section'])),
- ('level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['curriculum.Level'])),
- ('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
- ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50)),
- ('depth', self.gf('django.db.models.fields.IntegerField')()),
- ('order', self.gf('django.db.models.fields.IntegerField')()),
- ('xml_file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
- ('package', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
- ('student_package', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
- ('html_file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
- ))
- db.send_create_signal('catalogue', ['Lesson'])
-
-
- def backwards(self, orm):
- # Deleting model 'Section'
- db.delete_table('catalogue_section')
-
- # Deleting model 'Lesson'
- db.delete_table('catalogue_lesson')
-
-
- models = {
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'depth', 'order']", 'object_name': 'Lesson'},
- 'depth': ('django.db.models.fields.IntegerField', [], {}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']"}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'})
- },
- 'catalogue.section': {
- 'Meta': {'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0002_auto__add_field_section_slug.py b/catalogue/migrations/0002_auto__add_field_section_slug.py
deleted file mode 100644
index 4b7ef4c..0000000
--- a/catalogue/migrations/0002_auto__add_field_section_slug.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# -*- 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 field 'Section.slug'
- db.add_column('catalogue_section', 'slug',
- self.gf('django.db.models.fields.SlugField')(default='x', max_length=50),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting field 'Section.slug'
- db.delete_column('catalogue_section', 'slug')
-
-
- models = {
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'depth', 'order']", 'object_name': 'Lesson'},
- 'depth': ('django.db.models.fields.IntegerField', [], {}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']"}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'})
- },
- 'catalogue.section': {
- 'Meta': {'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0003_auto__chg_field_lesson_xml_file__chg_field_lesson_student_package__chg.py b/catalogue/migrations/0003_auto__chg_field_lesson_xml_file__chg_field_lesson_student_package__chg.py
deleted file mode 100644
index 8be90a8..0000000
--- a/catalogue/migrations/0003_auto__chg_field_lesson_xml_file__chg_field_lesson_student_package__chg.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# -*- 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):
-
- # Changing field 'Lesson.xml_file'
- db.alter_column('catalogue_lesson', 'xml_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.student_package'
- db.alter_column('catalogue_lesson', 'student_package', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.package'
- db.alter_column('catalogue_lesson', 'package', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.html_file'
- db.alter_column('catalogue_lesson', 'html_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
- # Adding unique constraint on 'Section', fields ['title']
- db.create_unique('catalogue_section', ['title'])
-
- # Adding unique constraint on 'Section', fields ['slug']
- db.create_unique('catalogue_section', ['slug'])
-
-
- def backwards(self, orm):
- # Removing unique constraint on 'Section', fields ['slug']
- db.delete_unique('catalogue_section', ['slug'])
-
- # Removing unique constraint on 'Section', fields ['title']
- db.delete_unique('catalogue_section', ['title'])
-
-
- # User chose to not deal with backwards NULL issues for 'Lesson.xml_file'
- raise RuntimeError("Cannot reverse this migration. 'Lesson.xml_file' and its values cannot be restored.")
-
- # User chose to not deal with backwards NULL issues for 'Lesson.student_package'
- raise RuntimeError("Cannot reverse this migration. 'Lesson.student_package' and its values cannot be restored.")
-
- # User chose to not deal with backwards NULL issues for 'Lesson.package'
- raise RuntimeError("Cannot reverse this migration. 'Lesson.package' and its values cannot be restored.")
-
- # User chose to not deal with backwards NULL issues for 'Lesson.html_file'
- raise RuntimeError("Cannot reverse this migration. 'Lesson.html_file' and its values cannot be restored.")
-
- models = {
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'depth', 'order']", 'object_name': 'Lesson'},
- 'depth': ('django.db.models.fields.IntegerField', [], {}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']"}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0004_auto__add_part__add_attachment__add_field_lesson_pdf__add_field_lesson.py b/catalogue/migrations/0004_auto__add_part__add_attachment__add_field_lesson_pdf__add_field_lesson.py
deleted file mode 100644
index 59ae0d7..0000000
--- a/catalogue/migrations/0004_auto__add_part__add_attachment__add_field_lesson_pdf__add_field_lesson.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- 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 'Part'
- db.create_table('catalogue_part', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('lesson', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Lesson'])),
- ('pdf', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True)),
- ('student_pdf', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True)),
- ))
- db.send_create_signal('catalogue', ['Part'])
-
- # Adding model 'Attachment'
- db.create_table('catalogue_attachment', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('lesson', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Lesson'])),
- ('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
- ))
- db.send_create_signal('catalogue', ['Attachment'])
-
- # Adding field 'Lesson.pdf'
- db.add_column('catalogue_lesson', 'pdf',
- self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True),
- keep_default=False)
-
- # Adding field 'Lesson.student_pdf'
- db.add_column('catalogue_lesson', 'student_pdf',
- self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting model 'Part'
- db.delete_table('catalogue_part')
-
- # Deleting model 'Attachment'
- db.delete_table('catalogue_attachment')
-
- # Deleting field 'Lesson.pdf'
- db.delete_column('catalogue_lesson', 'pdf')
-
- # Deleting field 'Lesson.student_pdf'
- db.delete_column('catalogue_lesson', 'student_pdf')
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'object_name': 'Attachment'},
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'depth', 'order']", 'object_name': 'Lesson'},
- 'depth': ('django.db.models.fields.IntegerField', [], {}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']"}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0005_auto__add_field_lesson_dc.py b/catalogue/migrations/0005_auto__add_field_lesson_dc.py
deleted file mode 100644
index ce7705f..0000000
--- a/catalogue/migrations/0005_auto__add_field_lesson_dc.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# -*- 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 field 'Lesson.dc'
- db.add_column('catalogue_lesson', 'dc',
- self.gf('jsonfield.fields.JSONField')(default='{}'),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting field 'Lesson.dc'
- db.delete_column('catalogue_lesson', 'dc')
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'object_name': 'Attachment'},
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'depth', 'order']", 'object_name': 'Lesson'},
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'depth': ('django.db.models.fields.IntegerField', [], {}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']"}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0006_auto__add_field_attachment_slug__add_field_attachment_ext__add_unique_.py b/catalogue/migrations/0006_auto__add_field_attachment_slug__add_field_attachment_ext__add_unique_.py
deleted file mode 100644
index 043627d..0000000
--- a/catalogue/migrations/0006_auto__add_field_attachment_slug__add_field_attachment_ext__add_unique_.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# -*- 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 field 'Attachment.slug'
- db.add_column('catalogue_attachment', 'slug',
- self.gf('django.db.models.fields.CharField')(default='', max_length=255),
- keep_default=False)
-
- # Adding field 'Attachment.ext'
- db.add_column('catalogue_attachment', 'ext',
- self.gf('django.db.models.fields.CharField')(default='', max_length=15),
- keep_default=False)
-
- # Adding unique constraint on 'Attachment', fields ['ext', 'lesson', 'slug']
- db.create_unique('catalogue_attachment', ['ext', 'lesson_id', 'slug'])
-
-
- def backwards(self, orm):
- # Removing unique constraint on 'Attachment', fields ['ext', 'lesson', 'slug']
- db.delete_unique('catalogue_attachment', ['ext', 'lesson_id', 'slug'])
-
- # Deleting field 'Attachment.slug'
- db.delete_column('catalogue_attachment', 'slug')
-
- # Deleting field 'Attachment.ext'
- db.delete_column('catalogue_attachment', 'ext')
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'depth', 'order']", 'object_name': 'Lesson'},
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'depth': ('django.db.models.fields.IntegerField', [], {}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']"}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0007_auto__add_field_lesson_type__chg_field_lesson_section.py b/catalogue/migrations/0007_auto__add_field_lesson_type__chg_field_lesson_section.py
deleted file mode 100644
index 25204db..0000000
--- a/catalogue/migrations/0007_auto__add_field_lesson_type__chg_field_lesson_section.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- 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 field 'Lesson.type'
- db.add_column('catalogue_lesson', 'type',
- self.gf('django.db.models.fields.CharField')(default='course', max_length=15, db_index=True),
- keep_default=False)
-
- # Changing field 'Lesson.section'
- db.alter_column('catalogue_lesson', 'section_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Section'], null=True))
- # Adding index on 'Lesson', fields ['order']
- db.create_index('catalogue_lesson', ['order'])
-
- if not db.dry_run:
- orm.Lesson.objects.filter(depth=0).update(type='synthetic')
-
-
- def backwards(self, orm):
- # Removing index on 'Lesson', fields ['order']
- db.delete_index('catalogue_lesson', ['order'])
-
- # Deleting field 'Lesson.type'
- db.delete_column('catalogue_lesson', 'type')
-
- section = 0
- if not db.dry_run:
- orm.Lesson.objects.filter(type='synthetic').update(depth=0)
- try:
- section = orm.Section.objects.all()[0]
- except orm.Section.DoesNotExist:
- pass
-
- # Changing field 'Lesson.section'
- db.alter_column('catalogue_lesson', 'section_id',
- self.gf('django.db.models.fields.related.ForeignKey')(default=section, to=orm['catalogue.Section']))
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'depth': ('django.db.models.fields.IntegerField', [], {}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
diff --git a/catalogue/migrations/0008_auto__del_field_lesson_depth.py b/catalogue/migrations/0008_auto__del_field_lesson_depth.py
deleted file mode 100644
index 4bd650f..0000000
--- a/catalogue/migrations/0008_auto__del_field_lesson_depth.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# -*- 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 'Lesson.depth'
- db.delete_column('catalogue_lesson', 'depth')
-
-
- def backwards(self, orm):
- # Adding field 'Lesson.depth'
- db.add_column('catalogue_lesson', 'depth',
- self.gf('django.db.models.fields.IntegerField')(default=1),
- keep_default=False)
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
diff --git a/catalogue/migrations/0009_auto__add_field_section_xml_file.py b/catalogue/migrations/0009_auto__add_field_section_xml_file.py
deleted file mode 100644
index 6686e5c..0000000
--- a/catalogue/migrations/0009_auto__add_field_section_xml_file.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# -*- 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 field 'Section.xml_file'
- db.add_column('catalogue_section', 'xml_file',
- self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting field 'Section.xml_file'
- db.delete_column('catalogue_section', 'xml_file')
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0010_auto.py b/catalogue/migrations/0010_auto.py
deleted file mode 100644
index 73602ca..0000000
--- a/catalogue/migrations/0010_auto.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# -*- 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 M2M table for field curriculum_courses on 'Lesson'
- db.create_table('catalogue_lesson_curriculum_courses', (
- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
- ('lesson', models.ForeignKey(orm['catalogue.lesson'], null=False)),
- ('curriculumcourse', models.ForeignKey(orm['curriculum.curriculumcourse'], null=False))
- ))
- db.create_unique('catalogue_lesson_curriculum_courses', ['lesson_id', 'curriculumcourse_id'])
-
-
- def backwards(self, orm):
- # Removing M2M table for field curriculum_courses on 'Lesson'
- db.delete_table('catalogue_lesson_curriculum_courses')
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'curriculum_courses': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['curriculum.CurriculumCourse']", 'symmetrical': 'False'}),
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'curriculum.curriculumcourse': {
- 'Meta': {'object_name': 'CurriculumCourse'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0011_auto__chg_field_lesson_xml_file__chg_field_lesson_student_pdf__chg_fie.py b/catalogue/migrations/0011_auto__chg_field_lesson_xml_file__chg_field_lesson_student_pdf__chg_fie.py
deleted file mode 100644
index 5963f2b..0000000
--- a/catalogue/migrations/0011_auto__chg_field_lesson_xml_file__chg_field_lesson_student_pdf__chg_fie.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# -*- 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):
-
- # Changing field 'Lesson.xml_file'
- db.alter_column('catalogue_lesson', 'xml_file', self.gf('django.db.models.fields.files.FileField')(max_length=255, null=True))
-
- # Changing field 'Lesson.student_pdf'
- db.alter_column('catalogue_lesson', 'student_pdf', self.gf('django.db.models.fields.files.FileField')(max_length=255, null=True))
-
- # Changing field 'Lesson.student_package'
- db.alter_column('catalogue_lesson', 'student_package', self.gf('django.db.models.fields.files.FileField')(max_length=255, null=True))
-
- # Changing field 'Lesson.package'
- db.alter_column('catalogue_lesson', 'package', self.gf('django.db.models.fields.files.FileField')(max_length=255, null=True))
-
- # Changing field 'Lesson.html_file'
- db.alter_column('catalogue_lesson', 'html_file', self.gf('django.db.models.fields.files.FileField')(max_length=255, null=True))
-
- # Changing field 'Lesson.pdf'
- db.alter_column('catalogue_lesson', 'pdf', self.gf('django.db.models.fields.files.FileField')(max_length=255, null=True))
-
- # Changing field 'Lesson.slug'
- db.alter_column('catalogue_lesson', 'slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255))
-
- # Changing field 'Section.xml_file'
- db.alter_column('catalogue_section', 'xml_file', self.gf('django.db.models.fields.files.FileField')(max_length=255, null=True))
-
- # Changing field 'Section.slug'
- db.alter_column('catalogue_section', 'slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255))
-
- def backwards(self, orm):
-
- # Changing field 'Lesson.xml_file'
- db.alter_column('catalogue_lesson', 'xml_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.student_pdf'
- db.alter_column('catalogue_lesson', 'student_pdf', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.student_package'
- db.alter_column('catalogue_lesson', 'student_package', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.package'
- db.alter_column('catalogue_lesson', 'package', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.html_file'
- db.alter_column('catalogue_lesson', 'html_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.pdf'
- db.alter_column('catalogue_lesson', 'pdf', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Lesson.slug'
- db.alter_column('catalogue_lesson', 'slug', self.gf('django.db.models.fields.SlugField')(max_length=50, unique=True))
-
- # Changing field 'Section.xml_file'
- db.alter_column('catalogue_section', 'xml_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True))
-
- # Changing field 'Section.slug'
- db.alter_column('catalogue_section', 'slug', self.gf('django.db.models.fields.SlugField')(max_length=50, unique=True))
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'curriculum_courses': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['curriculum.CurriculumCourse']", 'symmetrical': 'False'}),
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- 'curriculum.curriculumcourse': {
- 'Meta': {'ordering': "['slug']", 'object_name': 'CurriculumCourse'},
- 'accusative': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0012_auto__add_lessonstub.py b/catalogue/migrations/0012_auto__add_lessonstub.py
deleted file mode 100644
index d8e53bb..0000000
--- a/catalogue/migrations/0012_auto__add_lessonstub.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- 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 'LessonStub'
- db.create_table('catalogue_lessonstub', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('section', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Section'], null=True, blank=True)),
- ('level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['curriculum.Level'])),
- ('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
- ('type', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
- ('order', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
- ))
- db.send_create_signal('catalogue', ['LessonStub'])
-
-
- def backwards(self, orm):
- # Deleting model 'LessonStub'
- db.delete_table('catalogue_lessonstub')
-
-
- models = {
- 'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'curriculum_courses': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['curriculum.CurriculumCourse']", 'symmetrical': 'False'}),
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.lessonstub': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'LessonStub'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'})
- },
- 'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- 'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- 'curriculum.curriculumcourse': {
- 'Meta': {'ordering': "['slug']", 'object_name': 'CurriculumCourse'},
- 'accusative': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- 'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0013_auto__add_field_section_image.py b/catalogue/migrations/0013_auto__add_field_section_image.py
deleted file mode 100644
index e097d57..0000000
--- a/catalogue/migrations/0013_auto__add_field_section_image.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- 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 field 'Section.image'
- db.add_column(u'catalogue_section', 'image',
- self.gf('django.db.models.fields.files.ImageField')(max_length=100, null=True, blank=True),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting field 'Section.image'
- db.delete_column(u'catalogue_section', 'image')
-
-
- models = {
- u'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'curriculum_courses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['curriculum.CurriculumCourse']", 'symmetrical': 'False', 'blank': 'True'}),
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.lessonstub': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'LessonStub'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'})
- },
- u'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'curriculum.curriculumcourse': {
- 'Meta': {'ordering': "['slug']", 'object_name': 'CurriculumCourse'},
- 'accusative': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0014_auto__add_field_section_summary.py b/catalogue/migrations/0014_auto__add_field_section_summary.py
deleted file mode 100644
index 7805ec7..0000000
--- a/catalogue/migrations/0014_auto__add_field_section_summary.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# -*- 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 field 'Section.summary'
- db.add_column(u'catalogue_section', 'summary',
- self.gf('django.db.models.fields.TextField')(null=True, blank=True),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting field 'Section.summary'
- db.delete_column(u'catalogue_section', 'summary')
-
-
- models = {
- u'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'curriculum_courses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['curriculum.CurriculumCourse']", 'symmetrical': 'False', 'blank': 'True'}),
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.lessonstub': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'LessonStub'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'})
- },
- u'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'summary': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'curriculum.curriculumcourse': {
- 'Meta': {'ordering': "['slug']", 'object_name': 'CurriculumCourse'},
- 'accusative': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group_en': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'group_pl': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name_en': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'name_pl': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0015_auto__add_field_lesson_description.py b/catalogue/migrations/0015_auto__add_field_lesson_description.py
deleted file mode 100644
index 6d7dd5d..0000000
--- a/catalogue/migrations/0015_auto__add_field_lesson_description.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# -*- 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 field 'Lesson.description'
- db.add_column(u'catalogue_lesson', 'description',
- self.gf('django.db.models.fields.TextField')(null=True, blank=True),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting field 'Lesson.description'
- db.delete_column(u'catalogue_lesson', 'description')
-
-
- models = {
- u'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'curriculum_courses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['curriculum.CurriculumCourse']", 'symmetrical': 'False', 'blank': 'True'}),
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.lessonstub': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'LessonStub'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'})
- },
- u'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'summary': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'curriculum.curriculumcourse': {
- 'Meta': {'ordering': "['slug']", 'object_name': 'CurriculumCourse'},
- 'accusative': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group_en': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'group_pl': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name_en': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'name_pl': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/0016_auto__add_field_section_pic__add_field_section_pic_attribution__add_fi.py b/catalogue/migrations/0016_auto__add_field_section_pic__add_field_section_pic_attribution__add_fi.py
deleted file mode 100644
index 6be3fcf..0000000
--- a/catalogue/migrations/0016_auto__add_field_section_pic__add_field_section_pic_attribution__add_fi.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# -*- 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 field 'Section.pic'
- db.add_column(u'catalogue_section', 'pic',
- self.gf('django.db.models.fields.files.ImageField')(max_length=100, null=True, blank=True),
- keep_default=False)
-
- # Adding field 'Section.pic_attribution'
- db.add_column(u'catalogue_section', 'pic_attribution',
- self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True),
- keep_default=False)
-
- # Adding field 'Section.pic_src'
- db.add_column(u'catalogue_section', 'pic_src',
- self.gf('django.db.models.fields.URLField')(max_length=200, null=True, blank=True),
- keep_default=False)
-
-
- def backwards(self, orm):
- # Deleting field 'Section.pic'
- db.delete_column(u'catalogue_section', 'pic')
-
- # Deleting field 'Section.pic_attribution'
- db.delete_column(u'catalogue_section', 'pic_attribution')
-
- # Deleting field 'Section.pic_src'
- db.delete_column(u'catalogue_section', 'pic_src')
-
-
- models = {
- u'catalogue.attachment': {
- 'Meta': {'ordering': "['slug', 'ext']", 'unique_together': "(['lesson', 'slug', 'ext'],)", 'object_name': 'Attachment'},
- 'ext': ('django.db.models.fields.CharField', [], {'max_length': '15'}),
- 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'catalogue.lesson': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'Lesson'},
- 'curriculum_courses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['curriculum.CurriculumCourse']", 'symmetrical': 'False', 'blank': 'True'}),
- 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
- 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
- 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.lessonstub': {
- 'Meta': {'ordering': "['section', 'level', 'order']", 'object_name': 'LessonStub'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['curriculum.Level']"}),
- 'order': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
- 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Section']", 'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- 'type': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'})
- },
- u'catalogue.part': {
- 'Meta': {'object_name': 'Part'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['catalogue.Lesson']"}),
- 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
- },
- u'catalogue.section': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'pic': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
- 'pic_attribution': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
- 'pic_src': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
- 'summary': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
- 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
- },
- u'curriculum.curriculumcourse': {
- 'Meta': {'ordering': "['slug']", 'object_name': 'CurriculumCourse'},
- 'accusative': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
- 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- },
- u'curriculum.level': {
- 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
- 'group_en': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'group_pl': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name_en': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'name_pl': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
- 'order': ('django.db.models.fields.IntegerField', [], {}),
- 'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
- }
- }
-
- complete_apps = ['catalogue']
\ No newline at end of file
diff --git a/catalogue/migrations/__init__.py b/catalogue/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/catalogue/models.py b/catalogue/models.py
deleted file mode 100644
index bae04ed..0000000
--- a/catalogue/models.py
+++ /dev/null
@@ -1,317 +0,0 @@
-# -*- coding: utf-8
-from django.core.files import File
-from django.core.urlresolvers import reverse
-from django.db import models
-from jsonfield import JSONField
-from fnpdjango.storage import BofhFileSystemStorage
-from curriculum.models import Level, Curriculum, CurriculumCourse
-import logging
-
-bofh_storage = BofhFileSystemStorage()
-
-
-class Section(models.Model):
- title = models.CharField(max_length=255, unique=True)
- slug = models.SlugField(max_length=255, unique=True)
- order = models.IntegerField()
- xml_file = models.FileField(
- upload_to="catalogue/section/xml",
- null=True, blank=True, max_length=255,
- storage=bofh_storage)
- image = models.ImageField(upload_to="catalogue/section/image", null=True, blank=True)
-
- pic = models.ImageField(upload_to="catalogue/section/pic", null=True, blank=True)
- pic_attribution = models.CharField(max_length=255, null=True, blank=True)
- pic_src = models.URLField(null=True, blank=True)
-
- summary = models.TextField(blank=True, null=True)
-
- class Meta:
- ordering = ['order']
-
- class IncompleteError(BaseException):
- pass
-
- def __unicode__(self):
- return self.title
-
- def get_absolute_url(self):
- return "%s#gimnazjum_%s" % (reverse("catalogue_lessons"), self.slug)
-
- @classmethod
- def publish(cls, infile, ignore_incomplete=False):
- from librarian.parser import WLDocument
- from django.core.files.base import ContentFile
- xml = infile.get_string()
- wldoc = WLDocument.from_string(xml)
-
- lessons = []
- for part in wldoc.book_info.parts:
- try:
- lessons.append(Lesson.objects.get(slug=part.slug))
- except Lesson.DoesNotExist, e:
- if not ignore_incomplete:
- raise cls.IncompleteError(part.slug)
-
- slug = wldoc.book_info.url.slug
- try:
- section = cls.objects.get(slug=slug)
- except cls.DoesNotExist:
- section = cls(slug=slug, order=0)
-
- # Save XML file
- section.xml_file.save('%s.xml' % slug, ContentFile(xml), save=False)
- section.title = wldoc.book_info.title
- section.save()
-
- section.lesson_set.all().update(section=None)
- for i, lesson in enumerate(lessons):
- lesson.section = section
- lesson.order = i
- lesson.save()
-
- return section
-
- def syntetic_lesson(self, level):
- try:
- return self.lesson_set.filter(type='synthetic', level=level)[0]
- except IndexError:
- return None
-
-
-class Lesson(models.Model):
- section = models.ForeignKey(Section, null=True, blank=True)
- level = models.ForeignKey(Level)
- title = models.CharField(max_length=255)
- slug = models.SlugField(max_length=255, unique=True)
- type = models.CharField(max_length=15, db_index=True)
- order = models.IntegerField(db_index=True)
- dc = JSONField(default='{}')
- curriculum_courses = models.ManyToManyField(CurriculumCourse, blank=True)
- description = models.TextField(null=True, blank=True)
-
- xml_file = models.FileField(
- upload_to="catalogue/lesson/xml",
- null=True, blank=True, max_length=255, storage=bofh_storage)
- html_file = models.FileField(
- upload_to="catalogue/lesson/html",
- null=True, blank=True, max_length=255, storage=bofh_storage)
- package = models.FileField(
- upload_to="catalogue/lesson/pack",
- null=True, blank=True, max_length=255, storage=bofh_storage)
- student_package = models.FileField(
- upload_to="catalogue/lesson/student_pack",
- null=True, blank=True, max_length=255, storage=bofh_storage)
- pdf = models.FileField(
- upload_to="catalogue/lesson/pdf",
- null=True, blank=True, max_length=255, storage=bofh_storage)
- student_pdf = models.FileField(
- upload_to="catalogue/lesson/student_pdf",
- null=True, blank=True, max_length=255, storage=bofh_storage)
-
- class Meta:
- ordering = ['section', 'level', 'order']
-
- def __unicode__(self):
- return self.title
-
- @models.permalink
- def get_absolute_url(self):
- return 'catalogue_lesson', [self.slug]
-
- @classmethod
- def publish(cls, infile, ignore_incomplete=False):
- from librarian.parser import WLDocument
- from django.core.files.base import ContentFile
- wldoc = WLDocument(infile)
-
- # Check if not section metadata block.
- if wldoc.book_info.parts:
- return Section.publish(infile, ignore_incomplete=ignore_incomplete)
-
- slug = wldoc.book_info.url.slug
- try:
- lesson = cls.objects.get(slug=slug)
- lesson.attachment_set.all().delete()
- except cls.DoesNotExist:
- lesson = cls(slug=slug, order=0)
-
- # Save XML file
- lesson.xml_file.save('%s.xml' % slug, ContentFile(infile.get_string()), save=False)
- lesson.title = wldoc.book_info.title
-
- lesson.level = Level.objects.get(meta_name=wldoc.book_info.audience)
- lesson.populate_dc()
- lesson.populate_description(wldoc=wldoc)
- lesson.build_html(infile=infile)
- lesson.build_pdf()
- lesson.build_package()
- if lesson.type != 'project':
- lesson.build_pdf(student=True)
- lesson.build_package(student=True)
- return lesson
-
- def populate_dc(self):
- from librarian.parser import WLDocument
- wldoc = WLDocument.from_file(self.xml_file.path)
- self.dc = wldoc.book_info.to_dict()
- self.type = self.dc["type"]
- assert self.type in ('appendix', 'course', 'synthetic', 'project', 'added', 'added-var'), \
- u"Unknown lesson type: %s" % self.type
- self.save()
-
- courses = set()
- for identifier in wldoc.book_info.curriculum:
- identifier = (identifier or "").replace(' ', '')
- if not identifier:
- continue
- try:
- curr = Curriculum.objects.get(identifier__iexact=identifier)
- except Curriculum.DoesNotExist:
- logging.warn('Unknown curriculum course %s in lesson %s' % (identifier, self.slug))
- pass
- else:
- courses.add(curr.course)
- self.curriculum_courses = courses
-
- def populate_description(self, wldoc=None, infile=None):
- if wldoc is None:
- wldoc = self.wldocument(infile)
- if self.type == 'project':
- lookup = u'Zadanie'
- else:
- lookup = u'PomysÅ na lekcjÄ'
- for header in wldoc.edoc.findall('.//naglowek_rozdzial'):
- if (header.text or '').strip() == lookup:
- from lxml import etree
- self.description = etree.tostring(
- header.getnext(), method='text', encoding='unicode').strip()
- self.save()
- return
-
- def wldocument(self, infile=None):
- from librarian import IOFile
- from librarian.parser import WLDocument
- from .publish import OrmDocProvider
-
- if infile is None:
- infile = IOFile.from_filename(self.xml_file.path)
- for att in self.attachment_set.all():
- infile.attachments["%s.%s" % (att.slug, att.ext)] = \
- IOFile.from_filename(att.file.path)
- return WLDocument(infile, provider=OrmDocProvider())
-
- def build_html(self, infile=None):
- from .publish import HtmlFormat
- wldoc = self.wldocument(infile)
- html = HtmlFormat(wldoc).build()
- self.html_file.save("%s.html" % self.slug, File(open(html.get_filename())))
-
- def build_pdf(self, student=False):
- from .publish import PdfFormat
- # PDF uses document with attachments already saved as media,
- # otherwise sorl.thumbnail complains about SuspiciousOperations.
- wldoc = self.wldocument()
- if student:
- pdf = PdfFormat(wldoc).build()
- self.student_pdf.save("%s.pdf" % self.slug, File(open(pdf.get_filename())))
- else:
- pdf = PdfFormat(wldoc, teacher=True).build()
- self.pdf.save("%s.pdf" % self.slug, File(open(pdf.get_filename())))
-
- def add_to_zip(self, zipf, student=False, prefix=''):
- pdf = self.student_pdf if student else self.pdf
- if pdf:
- zipf.write(pdf.path, "%s%s%s.pdf" % (prefix, self.slug, "_student" if student else ""))
- for attachment in self.attachment_set.all():
- zipf.write(attachment.file.path, u"%smaterialy/%s.%s" % (prefix, attachment.slug, attachment.ext))
- zipf.write(self.xml_file.path, "%spliki-zrodlowe/%s.xml" % (prefix, self.slug))
-
- def build_package(self, student=False):
- from StringIO import StringIO
- import zipfile
- from django.core.files.base import ContentFile
- buff = StringIO()
- zipf = zipfile.ZipFile(buff, 'w', zipfile.ZIP_STORED)
- self.add_to_zip(zipf, student)
- zipf.close()
- fieldname = "student_package" if student else "package"
- getattr(self, fieldname).save(
- "%s%s.zip" % (self.slug, "_student" if student else ""),
- ContentFile(buff.getvalue()))
-
- def get_syntetic(self):
- if self.section is None:
- return None
- return self.section.syntetic_lesson(self.level)
-
- def get_other_level(self):
- if self.section is None:
- return None
- other_levels = self.section.lesson_set.exclude(level=self.level)
- if other_levels.exists():
- return other_levels[0].level
-
- def get_previous(self):
- if self.section is None:
- return None
- try:
- return self.section.lesson_set.filter(
- type=self.type, level=self.level,
- order__lt=self.order).order_by('-order')[0]
- except IndexError:
- return None
-
- def get_next(self):
- if self.section is None:
- return None
- try:
- return self.section.lesson_set.filter(
- type=self.type, level=self.level,
- order__gt=self.order).order_by('order')[0]
- except IndexError:
- return None
-
- def requires_internet(self):
- return 'internet' in self.dc.get('requires', [])
-
-
-class Attachment(models.Model):
- slug = models.CharField(max_length=255)
- ext = models.CharField(max_length=15)
- lesson = models.ForeignKey(Lesson)
- file = models.FileField(upload_to="catalogue/attachment", storage=bofh_storage)
-
- class Meta:
- ordering = ['slug', 'ext']
- unique_together = ['lesson', 'slug', 'ext']
-
- def __unicode__(self):
- return "%s.%s" % (self.slug, self.ext)
-
-
-class Part(models.Model):
- lesson = models.ForeignKey(Lesson)
- pdf = models.FileField(upload_to="catalogue/part/pdf", null=True, blank=True)
- student_pdf = models.FileField(upload_to="catalogue/part/student_pdf", null=True, blank=True)
-
-
-class LessonStub(models.Model):
- section = models.ForeignKey(Section, null=True, blank=True)
- level = models.ForeignKey(Level)
- title = models.CharField(max_length=255)
- type = models.CharField(max_length=15, db_index=True)
- order = models.IntegerField(db_index=True)
-
- class Meta:
- ordering = ['section', 'level', 'order']
-
- def __unicode__(self):
- return self.title
-
- @property
- def slug(self):
- return ''
-
- def add_to_zip(self, *args, **kwargs):
- pass
diff --git a/catalogue/publish.py b/catalogue/publish.py
deleted file mode 100755
index 89c76a1..0000000
--- a/catalogue/publish.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# -*- coding: utf-8
-from django.core.files import File
-from django.core.urlresolvers import reverse
-from librarian import DocProvider, IOFile
-from librarian.pyhtml import EduModuleFormat
-from librarian.pypdf import EduModulePDFFormat
-from .models import Lesson, Attachment
-from fnpdjango.utils.text.slughifi import slughifi
-
-
-# TODO: Using sorl.thumbnail for now,
-# but this should be done in Librarian,
-# directly using convert or PIL as a fallback.
-def get_image(src_img_path, width=None, default_width=1600, formats=('PNG', 'JPEG', 'GIF')):
- """ Returns an object with `url` and `storage` attributes,
- or None if using the original image is OK.
- """
-
- from PIL import Image
- from sorl.thumbnail import get_thumbnail
-
- # Does it need converting?
- # Yes, if width is given explicitly.
- convert = width is not None
- if not convert:
- # Looks like it doesn't need converting.
- # But let's try opening it and checking its type.
- try:
- simg = Image.open(src_img_path)
- except IOError:
- # It doesn't look like image,
- # but maybe it's convertable to one.
- convert = True
- else:
- if simg.format not in formats:
- # It's an image, but it's in some weird format.
- convert = True
- width = simg.size[0]
-
- if convert:
- if width is None:
- width = default_width
- return get_thumbnail(src_img_path, '%sx%s' % (width, 10*width))
- else:
- return None
-
-
-class HtmlFormat(EduModuleFormat):
- IMAGE_FORMATS = ('PNG', 'JPEG', 'GIF')
- DEFAULT_IMAGE_WIDTH = 1600
-
- def find_attachment(self, slug, fmt):
- lesson_slug = self.wldoc.book_info.url.slug
- try:
- # If already saved, use it.
- att = Attachment.objects.get(lesson__slug=lesson_slug,
- slug=slug, ext=fmt)
- except Attachment.DoesNotExist, e:
- # If attached to source IOFile, save now.
- att_name = "%s.%s" % (slug, fmt)
- try:
- att_file = self.wldoc.source.attachments[att_name]
- except KeyError:
- print u"ATTACHMENT MISSING:", att_name
- raise self.MaterialNotFound()
- else:
- lesson = Lesson.objects.get(slug=lesson_slug)
- att = lesson.attachment_set.create(slug=slug, ext=fmt)
- att.file.save(att_name, File(att_file.get_file()))
- return att
- else:
- return att
-
- def url_for_material(self, slug, fmt):
- return self.find_attachment(slug, fmt).file.url
-
- def url_for_image(self, slug, fmt, width=None):
- try:
- src_img = self.find_attachment(slug, fmt).file
- except self.MaterialNotFound:
- return ''
- img = get_image(src_img.path, width, self.DEFAULT_IMAGE_WIDTH, self.IMAGE_FORMATS)
- return (img or src_img).url
-
- def text_to_anchor(self, text):
- return slughifi(text)
-
- def get_forma_url(self, forma):
- return '%s#%s' % (
- reverse('catalogue_lesson', args=['metody']),
- self.text_to_anchor(forma)
- )
-
- def get_help_url(self, naglowek):
- return '%s%s#%s' % (
- '//edukacjamedialna.edu.pl',
- reverse('info', args=['jak-korzystac/']),
- self.naglowek_to_anchor(naglowek)
- )
-
-
-class PdfFormat(EduModulePDFFormat):
- IMAGE_FORMATS = ('PNG', 'JPEG', 'GIF')
- DEFAULT_IMAGE_WIDTH = 1600
-
- def get_image(self, name):
- src_img = super(PdfFormat, self).get_image(name)
- img = get_image(
- src_img.get_filename(),
- default_width=self.DEFAULT_IMAGE_WIDTH,
- formats=self.IMAGE_FORMATS)
- if img:
- return IOFile.from_filename(img.storage.path(img))
- else:
- return src_img
-
-
-class OrmDocProvider(DocProvider):
- def by_slug(self, slug):
- """Should return a file-like object with a WL document XML."""
- return IOFile.from_filename(Lesson.objects.get(slug=slug).xml_file.path)
diff --git a/catalogue/search_indexes.py b/catalogue/search_indexes.py
deleted file mode 100755
index 035ce98..0000000
--- a/catalogue/search_indexes.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-from haystack import indexes
-from .models import Lesson
-
-
-class LessonIndex(indexes.SearchIndex, indexes.Indexable):
- text = indexes.CharField(document=True, use_template=True)
-
- def get_model(self):
- return Lesson
diff --git a/catalogue/static/catalogue/css/carousel.css b/catalogue/static/catalogue/css/carousel.css
deleted file mode 100644
index 992e285..0000000
--- a/catalogue/static/catalogue/css/carousel.css
+++ /dev/null
@@ -1,110 +0,0 @@
-#catalogue-carousel {
- float: left;
- position: relative;
- width: 43.75em;
- height: 14.6875em;
- overflow: hidden;
- border-radius: 0.9375em;
-}
- #catalogue-carousel #catalogue-carousel-links {
- width: 28.75em;
- height: 14.6875em;
- list-style: none;
- margin: 0;
- padding: 0; }
- #catalogue-carousel #catalogue-carousel-links li {
- display: block;
- position: absolute;
- top: 0;
- left: 0;
- height: 100%;
- background-size: 100% 100%;
- border-top-left-radius: 0.9375em 6.38%;
- border-bottom-left-radius: 0.9375em 6.38%;
- z-index: 100;
- background-color: #888; }
- #catalogue-carousel #catalogue-carousel-links li a.catalogue-carousel-link {
- display: block;
- overflow: hidden;
- width: 28.75em;
- height: 100%;
- background: url(/static/catalogue/img/carousel-left.png) 100% 0 no-repeat;
- background-size: 4.375em 100%; }
- #catalogue-carousel #catalogue-carousel-links li a.catalogue-carousel-link .catalogue-carousel-note {
- position: relative;
- height: 100%;
- color: white;
- margin-top: 8.5em; }
- #catalogue-carousel #catalogue-carousel-links li a.catalogue-carousel-link .catalogue-carousel-note div:before {
- content: " ";
- display: block;
- position: absolute;
- height: 100%;
- width: 100%;
- z-index: -1;
- background-color: black;
- opacity: 0.6; }
- #catalogue-carousel #catalogue-carousel-links li a.catalogue-carousel-link .catalogue-carousel-note div p {
- padding: .4em 3em 0 .5em; }
- #catalogue-carousel #catalogue-carousel-links li a.catalogue-carousel-link .catalogue-carousel-note div p strong {
- font-size: 1.2em;
- display: block; }
- #catalogue-carousel #catalogue-carousel-links li a.catalogue-carousel-link .catalogue-carousel-note div p .more {
- position: absolute;
- right: 4em;
- top: 4.5em; }
- #catalogue-carousel #catalogue-carousel-links li a.catalogue-carousel-link:active {
- outline: none; }
- #catalogue-carousel #catalogue-carousel-links li .attribution {
- text-align: right;
- font-size: .75em;
- position: absolute;
- right: 5em;
- top: .1em;
- color: white;
- font-weight: bold;
- text-shadow: 0 0 5px #000; }
- #catalogue-carousel #catalogue-carousel-switcher {
- margin: 0;
- padding: 0.1875em 0 0 3.625em;
- width: 11.375em;
- height: 14.6875em;
- position: absolute;
- right: 0;
- top: 0;
- list-style: none;
- border-radius: 0 0.9375em 0.9375em 0;
- background-color: #ed7831;
- background-image: url(/static/catalogue/img/carousel-right.png);
- background-position: 0 0;
- background-repeat: no-repeat;
- background-size: auto 14.6875em;
- /* right part of mask as background */ }
- #catalogue-carousel #catalogue-carousel-switcher li {
- margin-bottom: .4em;
- font-size: .85em;
- line-height: 1em; }
- #catalogue-carousel #catalogue-carousel-switcher li a {
- text-transform: uppercase;
- color: #363a3e; }
- #catalogue-carousel #catalogue-carousel-switcher li a:before {
- vertical-align: top;
- margin-right: 1.5em; }
- #catalogue-carousel #catalogue-carousel-switcher li .knowledge:before {
- content: url(/static/img/icons/knowledge_dark.png); }
- #catalogue-carousel #catalogue-carousel-switcher li .activity:before {
- content: url(/static/img/icons/activity_dark.png); }
- #catalogue-carousel #catalogue-carousel-switcher li .lesson-plan:before {
- content: url(/static/img/icons/lesson-plan_dark.png); }
- #catalogue-carousel #catalogue-carousel-switcher li .reference:before {
- content: url(/static/img/icons/reference_dark.png); }
- #catalogue-carousel #catalogue-carousel-switcher li.activeSlide a {
- color: white; }
- #catalogue-carousel #catalogue-carousel-switcher li.activeSlide .knowledge:before {
- content: url(/static/img/icons/knowledge_white.png); }
- #catalogue-carousel #catalogue-carousel-switcher li.activeSlide .activity:before {
- content: url(/static/img/icons/activity_white.png); }
- #catalogue-carousel #catalogue-carousel-switcher li.activeSlide .lesson-plan:before {
- content: url(/static/img/icons/lesson-plan_white.png); }
- #catalogue-carousel #catalogue-carousel-switcher li.activeSlide .reference:before {
- content: url(/static/img/icons/reference_white.png); }
diff --git a/catalogue/static/catalogue/css/carousel.scss b/catalogue/static/catalogue/css/carousel.scss
deleted file mode 100755
index 299f95b..0000000
--- a/catalogue/static/catalogue/css/carousel.scss
+++ /dev/null
@@ -1,140 +0,0 @@
-$px: .0625em;
-
-$ciemny: #363a3e;
-
-
-#catalogue-carousel {
- float: left;
- position: relative;
- width: 700*$px;
- height: 235*$px;
- overflow: hidden;
- border-radius: 15*$px;
-
- #catalogue-carousel-links {
- width: 460*$px;
- height: 235*$px;
- list-style: none;
- margin: 0;
- padding: 0;
-
- li {
- display: block;
- position: absolute;
- top: 0;
- left: 0;
- height: 100%;
- background-size: 100% 100%;
- border-top-left-radius: 15*$px 6.38%;
- border-bottom-left-radius: 15*$px 6.38%;
- z-index: 100;
- background-color: #888;
-
- a.catalogue-carousel-link {
- display: block;
- overflow: hidden;
- width: 460*$px;
- height: 100%;
- background: url(/static/catalogue/img/carousel-left.png) 100% 0 no-repeat;
- background-size: 70*$px 100%;
-
- .catalogue-carousel-note {
- position: relative;
- height: 100%;
- color: white;
- margin-top: 8.5em;
-
- div {
- &:before {
- content: " ";
- display: block;
- position: absolute;
- height: 100%;
- width: 100%;
- z-index: -1;
- background-color: black;
- opacity: 0.6;
- }
-
- p {
- padding: .4em 3em 0 .5em;
-
- strong {
- font-size: 1.2em;
- display: block;
- }
-
- .more {
- position: absolute;
- right: 4em;
- top: 4.5em;
- }
- }
- }
- }
- }
- a.catalogue-carousel-link:active {
- outline: none;
- }
- .attribution {
- text-align: right;
- font-size: .75em;
- position: absolute;
- right: 5em;
- top: .1em;
- color: white;
- font-weight: bold;
- text-shadow: 0 0 5px #000;
- }
-
- }
- }
- #catalogue-carousel-switcher {
- margin: 0;
- padding: 3*$px 0 0 58*$px;
- width: 240*$px - 58*$px;
- height: 243*$px - 8*$px;
- position: absolute;
- right: 0;
- top: 0;
- list-style: none;
- border-radius: 0 15*$px 15*$px 0;
- background-color: #ed7831;
- background-image: url(/static/catalogue/img/carousel-right.png);
- background-position: 0 0;
- background-repeat: no-repeat;
- background-size: auto 235*$px;
-
- /* right part of mask as background */
-
- li {
- margin-bottom: .4em;
- font-size: .85em;
- line-height: 1em;
-
- a {
- text-transform: uppercase;
- color: $ciemny;
- }
- a:before {
- vertical-align: top;
- margin-right: 1.5em;
- }
- .knowledge:before {content: url(/static/img/icons/knowledge_dark.png);}
- .activity:before {content: url(/static/img/icons/activity_dark.png);}
- .lesson-plan:before {content: url(/static/img/icons/lesson-plan_dark.png);}
- .reference:before {content: url(/static/img/icons/reference_dark.png);}
- }
- li.activeSlide {
- a {
- color: white;
- }
- .knowledge:before {content: url(/static/img/icons/knowledge_white.png);}
- .activity:before {content: url(/static/img/icons/activity_white.png);}
- .lesson-plan:before {content: url(/static/img/icons/lesson-plan_white.png);}
- .reference:before {content: url(/static/img/icons/reference_white.png);}
- }
- }
-
-
-}
diff --git a/catalogue/static/catalogue/css/exercise.css b/catalogue/static/catalogue/css/exercise.css
deleted file mode 100644
index ce6f783..0000000
--- a/catalogue/static/catalogue/css/exercise.css
+++ /dev/null
@@ -1,231 +0,0 @@
-@charset "UTF-8";
-.exercise img {
- vertical-align: top; }
-.exercise .question-piece {
- border-radius: 0.6875em;
- padding: 0.5em 0.6875em; }
-.exercise .lista.punkt {
- list-style: none;
- margin: 0;
- padding: 0; }
-.exercise .lista li {
- margin: 0.3125em 0; }
-.exercise .question-piece.correct {
- background-color: #16a487;
- color: white; }
-.exercise .question-piece.incorrect {
- background-color: #f00;
- color: white; }
-.exercise .placeholder.dragover {
- background: #ed7831 !important; }
-.exercise .remove {
- float: right;
- display: inline-block;
- border-radius: 0.5em;
- padding: 0.25em 0.5em;
- margin: -0.25em -0.5em -0.25em 0.5em;
- background: #ed7831;
- color: white; }
-.exercise .buttons {
- background: #5e6165;
- border-radius: 0.5625em;
- height: 1.875em;
- line-height: 1.875em;
- overflow: hidden;
- color: white;
- margin-top: 1.875em; }
- .exercise .buttons input {
- height: 100%;
- border: 0;
- background: #8e9093;
- color: white;
- text-transform: uppercase;
- font-weight: bold; }
- .exercise .buttons .message {
- float: right;
- padding: 0 1.25em;
- background: red; }
- .exercise .buttons .maxscore {
- background: #16a487; }
- .exercise .buttons input.check {
- background: #ed7831; }
-
-.exercise .instruction, .exercise-wtem .instruction {
- display: block;
- margin: .3em;
- color: green;
- font-size: .9em; }
-.exercise .instruction:before, .exercise-wtem .instruction:before {
- content: "â "; }
-
-.luki .question-piece {
- background-color: #d4d6d8;
- color: #363a3e;
- cursor: pointer;
- z-index: 2;
- display: inline-block;
- margin: 0.3125em;
- z-index: 2;
- max-width: 38em; }
-.luki .question-piece.disabled {
- background-color: #eee;
- color: #d4d6d8; }
-.luki .placeholder {
- border-radius: 0.6875em;
- padding: 0.5em 0.6875em;
- display: inline-block;
- margin: 0.3125em;
- z-index: 2;
- width: 4em;
- background-color: #eee;
- z-index: 1; }
-.luki .placeholder:after {
- content: "\0000a0"; }
-
-.zastap .question-piece {
- background-color: #d4d6d8;
- color: #363a3e;
- cursor: pointer;
- z-index: 2;
- display: inline-block;
- margin: 0.3125em;
- z-index: 2; }
-.zastap .question-piece.disabled {
- background-color: #eee;
- color: #d4d6d8; }
-.zastap .question-piece.placeholder {
- background-color: inherit;
- color: inherit;
- cursor: inherit;
- z-index: inherit;
- display: inline;
- margin: 0;
- padding: 0;
- z-index: inherit;
- border-radius: 0; }
-
-.uporzadkuj .question-piece {
- background-color: #d4d6d8;
- color: #363a3e;
- cursor: pointer;
- z-index: 2; }
-.uporzadkuj .question-piece.disabled {
- background-color: #eee;
- color: #d4d6d8; }
-.uporzadkuj .lista {
- list-style: none;
- margin: 0;
- padding: 0;
- counter-reset: answer; }
- .uporzadkuj .lista li {
- counter-increment: answer;
- padding-right: 3em;
- background-image: url(/static/img/ornaments/draggable.png);
- background-repeat: no-repeat;
- background-position: 100% 50%; }
- .uporzadkuj .lista li:before {
- border-radius: 0.6875em;
- padding: 0.5em 0.6875em;
- background-color: #d4d6d8;
- color: #363a3e;
- cursor: pointer;
- z-index: 2;
- content: counter(answer);
- float: left;
- margin: -.5em 0 0 -3em; }
- .uporzadkuj .lista li.ui-sortable-placeholder {
- counter-increment: answer 0; }
- .uporzadkuj .lista li.ui-sortable-helper:before {
- content: none; }
-
-.przyporzadkuj .question-piece {
- background-color: #d4d6d8;
- color: #363a3e;
- cursor: pointer;
- z-index: 2;
- width: 38.625em; }
-.przyporzadkuj .question-piece.short {
- display: inline-block;
- margin: .2em .1em;
- width: auto; }
-.przyporzadkuj span.question-piece {
- display: inline-block;
- margin: .1em;
- width: auto; }
-.przyporzadkuj .question-piece.disabled {
- background-color: #eee;
- color: #d4d6d8; }
-.przyporzadkuj .predicate {
- list-style: none;
- margin: 0;
- padding: 0; }
- .przyporzadkuj .predicate > li {
- border-radius: 0.6875em;
- padding: 0.5em 0.6875em;
- display: inline-block;
- background-color: #5e6165;
- color: white;
- width: 11.75em;
- position: relative;
- vertical-align: top; }
- .przyporzadkuj .predicate > li .subjects {
- list-style: none;
- margin: 0;
- padding: 0;
- min-height: 2.8125em;
- position: relative;
- margin: 0.5em -0.6875em -0.5em -0.6875em;
- padding: 0.5em 0.6875em; }
- .przyporzadkuj .predicate > li .subjects li {
- width: auto; }
- .przyporzadkuj .predicate > li .subjects .placeholder {
- border-radius: 0.6875em;
- padding: 0.5em 0.6875em;
- text-align: right;
- position: relative;
- padding: 0.5em 0.6875em;
- margin: 0 -0.6875em; }
- .przyporzadkuj .predicate > li .subjects .multiple {
- position: absolute;
- z-index: -1;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- margin: 0; }
- .przyporzadkuj .predicate > li .subjects .placeholder.dragover {
- z-index: 1; }
- .przyporzadkuj .predicate > li .subjects .placeholder:after {
- content: "upuÅÄ tutaj";
- text-style: italic; }
-.przyporzadkuj .subject {
- list-style: none;
- margin: 0;
- padding: 0; }
-
-.prawdafalsz .question li.question-piece {
- position: relative;
- padding-left: 11em; }
-.prawdafalsz .question .buttons {
- margin-top: 0;
- top: 0;
- left: 0;
- position: absolute;
- background-color: #d4d6d8;
- color: #363a3e;
- display: inline-block; }
- .prawdafalsz .question .buttons a {
- color: #363a3e;
- text-transform: uppercase;
- font-weight: bold;
- display: inline-block;
- padding: 0 0.6875em; }
- .prawdafalsz .question .buttons a.chosen {
- background: #ed7831;
- color: white; }
-
-.wybor .question .lista {
- list-style: none;
- padding: 0; }
- .wybor .question .lista li {
- margin: 0; }
diff --git a/catalogue/static/catalogue/css/exercise.scss b/catalogue/static/catalogue/css/exercise.scss
deleted file mode 100755
index a9fc200..0000000
--- a/catalogue/static/catalogue/css/exercise.scss
+++ /dev/null
@@ -1,320 +0,0 @@
-$px: 0.0625em;
-$oranji: #ed7831;
-$ciemny: #363a3e;
-$zielony: #16a487;
-
-
-@mixin bubble {
- border-radius: 11*$px;
- padding: 8*$px 11*$px;
-}
-@mixin bubble-drag {
- background-color: #d4d6d8;
- color: #363a3e;
- cursor: pointer;
- z-index: 2;
-}
-@mixin bubble-drag-disabled {
- background-color: #eee;
- color: #d4d6d8;
-}
-@mixin un-bubble-drag {
- background-color: inherit;
- color: inherit;
- cursor: inherit;
- z-index: inherit;
-}
-
-@mixin bubble-inline {
- display: inline-block;
- margin: 5*$px;
- z-index: 2;
-}
-@mixin un-bubble-inline {
- display: inline;
- margin: 0;
- padding: 0;
- z-index: inherit;
- border-radius: 0;
-}
-@mixin list-plain {
- list-style: none;
- margin: 0;
- padding: 0;
-}
-
-
-.exercise {
- img {
- vertical-align: top;
- }
-
- .question-piece {
- @include bubble;
- }
- .lista.punkt {
- @include list-plain;
- }
- .lista {
- li {
- margin: 5*$px 0;
- }
- }
-
- .question-piece.correct {
- background-color: #16a487;
- color: white;
- }
- .question-piece.incorrect {
- background-color: #f00;
- color: white;
- }
-
- .placeholder.dragover {
- background: #ed7831 !important;
- }
-
- .remove {
- float: right;
- display: inline-block;
- border-radius: 8*$px;
- padding: 4*$px 8*$px;
- margin: -4*$px -8*$px -.25em 8*$px;
- background: #ed7831;
- color: white;
- }
-
- .buttons {
- background: #5e6165;
- border-radius: 9*$px;
- height: 30*$px;
- line-height: 30*$px;
- overflow: hidden;
- color: white;
- margin-top: 30*$px;
-
- input {
- height: 100%;
- border: 0;
- background: #8e9093;
- color: white;
- text-transform: uppercase;
- font-weight: bold;
- }
- .message {
- float: right;
- padding: 0 20*$px;
- background: red;
- }
- .maxscore {
- background: #16a487;
- }
-
- input.check {
- background: #ed7831;
-
- }
- }
-}
-
-
-.exercise, .exercise-wtem {
- .instruction {
- display: block;
- margin: .3em;
- color: green;
- font-size: .9em;
- }
- .instruction:before {
- content: "â ";
- }
-}
-
-
-.luki {
- .question-piece {
- @include bubble-drag;
- @include bubble-inline;
- max-width: 608*$px;
- }
- .question-piece.disabled {
- @include bubble-drag-disabled;
- }
-
- .placeholder {
- @include bubble;
- @include bubble-inline;
-
- width: 4em;
- background-color: #eee;
- z-index: 1;
- }
- .placeholder:after {
- content: "\0000a0";
- }
-}
-
-
-.zastap {
- .question-piece {
- @include bubble-drag;
- @include bubble-inline;
- }
- .question-piece.disabled {
- @include bubble-drag-disabled;
- }
- .question-piece.placeholder {
- @include un-bubble-drag;
- @include un-bubble-inline;
- }
-}
-
-.uporzadkuj {
- .question-piece {
- @include bubble-drag;
- }
- .question-piece.disabled {
- @include bubble-drag-disabled;
- }
- .lista {
- @include list-plain;
- counter-reset: answer;
- li {
- counter-increment: answer;
- padding-right: 3em;
- background-image: url(/static/img/ornaments/draggable.png);
- background-repeat: no-repeat;
- background-position: 100% 50%;
- }
- li:before {
- @include bubble;
- @include bubble-drag;
- content: counter(answer);
- float: left;
- margin: -.5em 0 0 -3em;
- }
- li.ui-sortable-placeholder {
- counter-increment: answer 0;
- }
- li.ui-sortable-helper:before {
- content: none;
- }
- }
-}
-
-.przyporzadkuj {
- .question-piece {
- @include bubble-drag;
- width: 618*$px;
- }
- .question-piece.short {
- display: inline-block;
- margin: .2em .1em;
- width: auto;
- }
- span.question-piece {
- display: inline-block;
- margin: .1em;
- width: auto;
- }
- .question-piece.disabled {
- @include bubble-drag-disabled;
- }
- .predicate {
- @include list-plain;
-
- > li {
- @include bubble;
- display: inline-block;
- background-color: #5e6165;
- color: white;
- width: 188*$px;
- position: relative;
- vertical-align: top;
-
- .subjects {
- @include list-plain;
- min-height: 45*$px;
- position: relative;
- margin: 8*$px -11*$px -8*$px -11*$px;
- padding: 8*$px 11*$px;
-
- li {
- width: auto;
- }
-
- .placeholder {
- @include bubble;
- text-align: right;
- position:relative;
- padding: 8*$px 11*$px;
- margin: 0 -11*$px;
- }
- .multiple {
- position: absolute;
- z-index: -1;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- margin: 0;
- }
-
- .placeholder.dragover {
- z-index: 1;
- }
- .placeholder:after {
- content: "upuÅÄ tutaj";
- text-style: italic;
- }
- }
- }
- .comment {
- }
- }
- .subject {
- @include list-plain;
- }
-
-}
-
-
-.prawdafalsz .question {
- li.question-piece {
- position: relative;
- padding-left: 11em;
- }
-
- .buttons {
- margin-top: 0;
- top: 0;
- left: 0;
- position: absolute;
-
- background-color: #d4d6d8;
- color: #363a3e;
- display: inline-block;
-
- a {
- color: #363a3e;
- text-transform: uppercase;
- font-weight: bold;
- display: inline-block;
- padding: 0 11*$px;
- }
- a.chosen {
- background: #ed7831;
- color: white;
- }
- }
-}
-
-.wybor .question {
- .lista {
- list-style: none;
- padding: 0;
- li {
- margin: 0;
- }
- }
-}
diff --git a/catalogue/static/catalogue/css/lesson.css b/catalogue/static/catalogue/css/lesson.css
deleted file mode 100644
index c8e73c4..0000000
--- a/catalogue/static/catalogue/css/lesson.css
+++ /dev/null
@@ -1,254 +0,0 @@
-/* =================================================== */
-/* = Common elements: headings, paragraphs and lines = */
-/* =================================================== */
-/*h1 {
- font-size: 3em;
- margin: 1.5em 0;
- text-align: center;
- line-height: 1.5em;
- font-weight: bold;
-}
-
-h2 {
- font-size: 2em;
- margin: 1.5em 0 0;
- font-weight: bold;
- line-height: 1.5em;
-}
-
-h3 {
- font-size: 1.5em;
- margin: 1.5em 0 0;
- font-weight: normal;
- line-height: 1.5em;
-}
-
-h4 {
- font-size: 1em;
- margin: 1.5em 0 0;
- line-height: 1.5em;
-}
-
-p {
- margin: 0;
-}
-*/
-/* ======================== */
-/* = Footnotes and themes = */
-/* ======================== */
-.annotation {
- font-style: normal;
- font-weight: normal;
- font-size: 12px;
- padding-left: 2px;
- position: relative;
- top: -4px; }
-
-#footnotes {
- margin-top: 3em; }
-
-#footnotes .annotation {
- display: block;
- float: left;
- width: 2.5em;
- clear: both; }
-
-#footnotes div {
- margin: 1.5em 0 0 0; }
-
-#footnotes p, #footnotes ul {
- margin-left: 2.5em;
- font-size: 0.875em; }
-
-#footnotes .permalink {
- font-size: .75em; }
-
-blockquote {
- font-size: 0.875em; }
-
-/* ============= */
-/* = Numbering = */
-/* ============= */
-.verse, .paragraph {
- position: relative; }
-
-.anchor {
- position: absolute;
- margin: -0.25em -0.5em;
- left: -3em;
- color: #777;
- font-size: 12px;
- width: 2em;
- text-align: center;
- padding: 0.25em 0.5em;
- line-height: 1.5em; }
-
-.anchor:hover, #book-text .anchor:active {
- color: #FFF;
- background-color: #CCC; }
-
-/* =================== */
-/* = Custom elements = */
-/* =================== */
-span.author {
- font-size: 0.5em;
- display: block;
- line-height: 1.5em;
- margin-bottom: 0.25em; }
-
-span.collection {
- font-size: 0.375em;
- display: block;
- line-height: 1.5em;
- margin-bottom: -0.25em; }
-
-span.subtitle {
- font-size: 0.5em;
- display: block;
- line-height: 1.5em;
- margin-top: -0.25em; }
-
-span.translator {
- font-size: 0.375em;
- display: block;
- line-height: 1.5em;
- margin-top: 0.25em; }
-
-div.didaskalia {
- font-style: italic;
- margin: 0.5em 0 0 1.5em; }
-
-div.kwestia {
- margin: 0.5em 0 0; }
-
-div.stanza {
- margin: 1.5em 0 0; }
-
-div.kwestia div.stanza {
- margin: 0; }
-
-p.paragraph {
- text-align: justify;
- margin: 1.5em 0 0; }
-
-p.motto {
- text-align: justify;
- font-style: italic;
- margin: 1.5em 0 0; }
-
-p.motto_podpis {
- font-size: 0.875em;
- text-align: right; }
-
-div.fragment {
- border-bottom: 0.1em solid #999;
- padding-bottom: 1.5em; }
-
-div.note p, div.dedication p, div.note p.paragraph, div.dedication p.paragraph {
- text-align: right;
- font-style: italic; }
-
-hr.spacer {
- height: 3em;
- visibility: hidden; }
-
-hr.spacer-line {
- margin: 1.5em 0;
- border: none;
- border-bottom: 0.1em solid #000; }
-
-p.spacer-asterisk {
- padding: 0;
- margin: 1.5em 0;
- text-align: center; }
-
-div.person-list ol {
- list-style: none;
- padding: 0 0 0 1.5em; }
-
-p.place-and-time {
- font-style: italic; }
-
-em.math, em.foreign-word, em.book-title, em.didaskalia {
- font-style: italic; }
-
-em.author-emphasis {
- letter-spacing: 0.1em; }
-
-em.person {
- font-style: normal;
- font-variant: small-caps; }
-
-.verse:after {
- content: "\feff"; }
-
-/* =================================== */
-/* = Hide some elements for printing = */
-/* =================================== */
-@media print {
- #menu {
- display: none; } }
-.activity {
- clear: both; }
-
-.activity .text {
- width: 27.5em;
- margin-right: 20px;
- float: left; }
-
-.activity .description p:first-child {
- margin-top: 0; }
-
-.activity {
- margin-top: 2em; }
- .activity .act_counter {
- float: left;
- margin-right: .5em;
- font-size: 2em; }
- .activity .info {
- float: right;
- width: 8.4375em; }
- .activity .info .infobox {
- padding: 1em 0;
- border-top: 1px solid #c9ccce; }
- .activity .info .infobox h1 {
- text-transform: uppercase;
- font-weight: bold;
- margin: 0 0 0.5em -2.1875em;
- padding-left: 2.1875em;
- line-height: 24px;
- font-size: 1em; }
- .activity .info .infobox p {
- margin: 0; }
- .activity .info .time h1 {
- background: url(/static/img/icons/activity-time.png) 0 0 no-repeat; }
- .activity .info .kind h1 {
- background: url(/static/img/icons/activity-kind.png) 0 0 no-repeat; }
- .activity .info .materials h1 {
- background: url(/static/img/icons/activity-tools.png) 0 0 no-repeat; }
-
-.lista .paragraph {
- margin: .3em 0; }
-.lista li {
- margin: .75em 0; }
-
-.clearboth {
- clear: both; }
-
-#book-text .caption {
- margin: 1.5em; }
- #book-text .caption p {
- margin: 0; }
-
-/* utils */
-.clr {
- clear: both; }
-
-#book-text .top-link {
- margin-top: 1em; }
-
-.help {
- font-size: .7em;
- padding: 0 .5em;
- color: #888;
- vertical-align: super; }
diff --git a/catalogue/static/catalogue/css/lesson.scss b/catalogue/static/catalogue/css/lesson.scss
deleted file mode 100755
index d98f1a3..0000000
--- a/catalogue/static/catalogue/css/lesson.scss
+++ /dev/null
@@ -1,327 +0,0 @@
-$px: .0625em;
-
-/* =================================================== */
-/* = Common elements: headings, paragraphs and lines = */
-/* =================================================== */
-
-/*h1 {
- font-size: 3em;
- margin: 1.5em 0;
- text-align: center;
- line-height: 1.5em;
- font-weight: bold;
-}
-
-h2 {
- font-size: 2em;
- margin: 1.5em 0 0;
- font-weight: bold;
- line-height: 1.5em;
-}
-
-h3 {
- font-size: 1.5em;
- margin: 1.5em 0 0;
- font-weight: normal;
- line-height: 1.5em;
-}
-
-h4 {
- font-size: 1em;
- margin: 1.5em 0 0;
- line-height: 1.5em;
-}
-
-p {
- margin: 0;
-}
-*/
-
-/* ======================== */
-/* = Footnotes and themes = */
-/* ======================== */
-
-.annotation {
- font-style: normal;
- font-weight: normal;
- font-size: 12px;
- padding-left: 2px;
- position: relative;
- top: -4px;
-}
-
-#footnotes {
- margin-top: 3em;
-}
-
-#footnotes .annotation {
- display: block;
- float: left;
- width: 2.5em;
- clear: both;
-}
-
-#footnotes div {
- margin: 1.5em 0 0 0;
-}
-
-#footnotes p, #footnotes ul {
- margin-left: 2.5em;
- font-size: 0.875em;
-}
-
-#footnotes .permalink {
- font-size: .75em;
-}
-
-blockquote {
- font-size: 0.875em;
-}
-
-/* ============= */
-/* = Numbering = */
-/* ============= */
-.verse, .paragraph {
- position:relative;
-}
-.anchor {
- position: absolute;
- margin: -0.25em -0.5em;
- left: -3em;
- color: #777;
- font-size: 12px;
- width: 2em;
- text-align: center;
- padding: 0.25em 0.5em;
- line-height: 1.5em;
-}
-
-.anchor:hover, #book-text .anchor:active {
- color: #FFF;
- background-color: #CCC;
-}
-
-/* =================== */
-/* = Custom elements = */
-/* =================== */
-span.author {
- font-size: 0.5em;
- display: block;
- line-height: 1.5em;
- margin-bottom: 0.25em;
-}
-
-span.collection {
- font-size: 0.375em;
- display: block;
- line-height: 1.5em;
- margin-bottom: -0.25em;
-}
-
-span.subtitle {
- font-size: 0.5em;
- display: block;
- line-height: 1.5em;
- margin-top: -0.25em;
-}
-
-span.translator {
- font-size: 0.375em;
- display: block;
- line-height: 1.5em;
- margin-top: 0.25em;
-}
-
-div.didaskalia {
- font-style: italic;
- margin: 0.5em 0 0 1.5em;
-}
-
-div.kwestia {
- margin: 0.5em 0 0;
-}
-
-div.stanza {
- margin: 1.5em 0 0;
-}
-
-div.kwestia div.stanza {
- margin: 0;
-}
-
-p.paragraph {
- text-align: justify;
- margin: 1.5em 0 0;
-}
-
-p.motto {
- text-align: justify;
- font-style: italic;
- margin: 1.5em 0 0;
-}
-
-p.motto_podpis {
- font-size: 0.875em;
- text-align: right;
-}
-
-div.fragment {
- border-bottom: 0.1em solid #999;
- padding-bottom: 1.5em;
-}
-
-div.note p, div.dedication p, div.note p.paragraph, div.dedication p.paragraph {
- text-align: right;
- font-style: italic;
-}
-
-hr.spacer {
- height: 3em;
- visibility: hidden;
-}
-
-hr.spacer-line {
- margin: 1.5em 0;
- border: none;
- border-bottom: 0.1em solid #000;
-}
-
-p.spacer-asterisk {
- padding: 0;
- margin: 1.5em 0;
- text-align: center;
-}
-
-div.person-list ol {
- list-style: none;
- padding: 0 0 0 1.5em;
-}
-
-p.place-and-time {
- font-style: italic;
-}
-
-em.math, em.foreign-word, em.book-title, em.didaskalia {
- font-style: italic;
-}
-
-em.author-emphasis {
- letter-spacing: 0.1em;
-}
-
-em.person {
- font-style: normal;
- font-variant: small-caps;
-}
-
-.verse:after {
- content: "\feff";
-}
-
-
-/* =================================== */
-/* = Hide some elements for printing = */
-/* =================================== */
-
-@media print {
- #menu {display: none;}
-}
-
-
-
-.activity {
- clear:both;
-}
-
-.activity .text {
- width: 440*$px;
- margin-right: 20px;
- float: left;
-}
-
-.activity .description p:first-child {
- margin-top: 0;
-}
-
-
-
-.activity {
- margin-top: 2em;
-
- .act_counter {
- float: left;
- margin-right: .5em;
- font-size: 2em;
- }
-
- .info {
- float: right;
- width: 135*$px;
-
- .infobox {
- padding: 1em 0;
- border-top: 1px solid #c9ccce;
- h1 {
- text-transform: uppercase;
- font-weight: bold;
- margin: 0 0 .5em -35*$px;
- padding-left: 35*$px;
- line-height: 24px;
- font-size: 1em;
- }
- p {
- margin: 0;
- }
-
- }
- .time h1 {
- background: url(/static/img/icons/activity-time.png) 0 0 no-repeat;
- }
- .kind h1 {
- background: url(/static/img/icons/activity-kind.png) 0 0 no-repeat;
- }
- .materials h1 {
- background: url(/static/img/icons/activity-tools.png) 0 0 no-repeat;
- }
- }
-}
-
-.lista {
- .paragraph {
- margin: .3em 0;
- }
- li {
- margin: .75em 0;
- }
-}
-
-
-.clearboth {
- clear: both;
-}
-
-#book-text {
- .caption {
- margin: 1.5em;
- p {
- margin: 0;
- }
- }
-}
-
-/* utils */
-
-.clr {
- clear: both;
-}
-
-#book-text .top-link {
- margin-top: 1em;
-}
-
-.help {
- font-size: .7em;
- padding: 0 .5em;
- color: #888;
- vertical-align: super;
-}
diff --git a/catalogue/static/catalogue/css/section_list.css b/catalogue/static/catalogue/css/section_list.css
deleted file mode 100644
index bd68dee..0000000
--- a/catalogue/static/catalogue/css/section_list.css
+++ /dev/null
@@ -1,58 +0,0 @@
-#level-chooser-place {
- min-height: 5.9375em;
- margin-top: 2em; }
- #level-chooser-place ul#level-chooser {
- margin: 0;
- padding: 1em 0 1em 8.75em;
- background-color: white;
- width: 31.25em;
- z-index: 300;
- position: relative;
- text-transform: uppercase;
- text-align: right; }
- #level-chooser-place ul#level-chooser .home {
- display: none;
- position: absolute;
- top: 1.5em;
- left: 0; }
- #level-chooser-place ul#level-chooser .home a {
- background: none;
- padding: 0; }
- #level-chooser-place ul#level-chooser .home a img {
- width: 7.5em; }
- #level-chooser-place ul#level-chooser.fixed {
- position: fixed;
- top: 0;
- border-bottom: 1px solid #c9ccce; }
- #level-chooser-place ul#level-chooser.fixed .home {
- display: block; }
- #level-chooser-place ul#level-chooser li {
- display: inline-block;
- list-style: none;
- max-width: 175px; }
- #level-chooser-place ul#level-chooser li a {
- display: table-cell;
- padding: .5em 1em;
- border-radius: 0.3125em;
- background: #eee;
- height: 2.625em;
- vertical-align: middle; }
- #level-chooser-place ul#level-chooser li a.active {
- color: white;
- background: #ED7831; }
-
-.level .link-list {
- margin-left: 1em; }
-.level .level-toc {
- overflow: hidden;
- /* Because we're changing bg color lower. */ }
- .level .level-toc.fixed {
- position: fixed; }
- .level .level-toc .link-list {
- margin-left: 1em; }
- .level .level-toc .link-list li {
- margin-bottom: 0; }
- .level .level-toc .link-list li.curriculumcourses {
- margin: 10px -17px -17px;
- padding: 10px 16px 16px;
- background-color: #eee; }
diff --git a/catalogue/static/catalogue/css/section_list.scss b/catalogue/static/catalogue/css/section_list.scss
deleted file mode 100755
index fda2be3..0000000
--- a/catalogue/static/catalogue/css/section_list.scss
+++ /dev/null
@@ -1,90 +0,0 @@
-$px: 0.0625em;
-
-#level-chooser-place {
- min-height: 95*$px;
- margin-top: 2em;
-
- ul#level-chooser {
- margin: 0;
- padding: 16*$px 0 16*$px 140*$px;
- background-color: white;
- width: 500*$px;
- z-index: 300;
- position: relative;
- text-transform: uppercase;
- text-align: right;
-
- .home {
- display: none;
- position: absolute;
- top: 1.5em;
- left: 0;
-
- a {
- background: none;
- padding: 0;
- img {
- width: 120*$px;
- }
- }
- }
-
- &.fixed {
- position: fixed;
- top: 0;
- border-bottom: 1px solid #c9ccce;
-
- .home {
- display: block;
- }
- }
-
- li {
- display: inline-block;
- list-style: none;
- max-width: 175px;
-
- a {
- display: table-cell;
- padding: .5em 1em;
- border-radius: 5*$px;
- background: #eee;
- height: 42*$px;
- vertical-align: middle;
-
- &.active {
- color: white;
- background: #ED7831;
- }
- }
- }
- }
-}
-
-.level {
- .link-list {
- margin-left: 1em;
- }
-
- .level-toc {
- overflow: hidden; /* Because we're changing bg color lower. */
-
- &.fixed {
- position: fixed;
- }
-
- .link-list {
- margin-left: 1em;
-
- li {
- margin-bottom: 0;
-
- &.curriculumcourses {
- margin: 10px -17px -17px;
- padding: 10px 16px 16px;
- background-color: #eee;
- }
- }
- }
- }
-}
diff --git a/catalogue/static/catalogue/img/carousel-left.png b/catalogue/static/catalogue/img/carousel-left.png
deleted file mode 100644
index 3f6090bd6a38d9b2b521e2c0f88ea9f697e7acfe..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2139
zcmV-h2&DIkP)e
zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00+ZKL_t(|+U=cPh*eb>hM%=(
z)I=v6XBxG#ES0F#$sf#&D9XC2D76SHDf7aMH0vfJ6se2A5G>es`FsT|&?x!gd9Pq6g<65)R&TZ5fk2RM9Th$o1
zwgWp9j2ovDz~dSvf1J(&egOukF==ZK0WYXAerqNHUxo5|f-uI`R{JqQqjXA~jsvSS
zO8z(v2fhKi)R?q2eZYGfC4a32jwu+oz65qE82?OoH6S|px`XgAU_UTOjY(T`79T{?Z9|7#+?a2
zrN)$>3Gb!JC#~jfj5#?I{!oqaTQd>(TEX}S;k}g3#ndQy+7W7u$C?h{cQwYf<_M+p
zz10|xHBIXYC*-?!0NWIdza8;}MydQv_$S~DHO8F@uTx|E)?7}h^=Z_YbZxdbjgn^&
zep;jCkJE7b_T8<|WILiT##n2n0-w=Okx26L)SnHf7DJmG-
z6MjXF@mo`KPdK62wSyYBVktBj+m2YSQS!&B6aPBlsH1dpiQ21Zd99fuBFCkQN+Myi
zi7J`eF~jZ!*J
zCxDeY`1-9GMrjwdfoe?Jn!^ONflp}GOwhr%{2;ssI7c;c;mlWK{9yWBC!E9z#`c8Q
zX?Fb9Tvjehv4d$7k!=db4`-f&@q_6Ukw0VY;Pp2MYfrczYo>_E35}9}5ZZOO2Q9ky;3OC
zj!+7IFavZRzU$d@9(cDYi4*+JGN`^G^4>u^BUy3U?uj4a`z1{Awho^R9brj0USQ>AIs*
zDA5=rBJGqmT_0EJV`4F8S~XB&0<)yr2gI=BP&e>vwU3LznA>W3P|>%0YXf#u!)e4t
zH>Q^wf*xm}Rv-u*iFD_S@5q*_e6tJh-U)`JT3?8>=zXsk5hBR4~ixeS#wHGT#mS
zOr1+oi)hTf=#?zIGu`ij(e*x8(Tus03L4!pf?3k26cp+DNZOcP}uq(a)WCV|tqb
zr3he_H|vQ_j$>3;Pq)a%+|$e_H#xPX?w)Q@jhRl9*XiaJ%<^U*z~nGS-FEIWNR4p^
z-9c)MJJa0-oZswY<;|Fxz`3nBP~N~)yiPZoDA}Iw?pBO1c{65CtDxk@m|E89#$wFm
zRzk@Wn1@?^K$C+Qb=eP$s4?l9oy9>-;I_0;x&-_PH6~q|?Y$5>m=#$a*aRG-ruKC6
zY|PzR9^3?KOVfM0c{OGR8SlLiDwyS2zW@_pj4IlDAx2~7XALDdV{Cij8{opMUrT7l
zTmg&;;e~_-W@#uEn}A}}L+PuLA!5xEBVm>iU8A(U=PZOdG2Nu9I^%0OTv
zIohW?X#tdW;7#Bva#Tr^p|k<712>VgGEIiEfs9r}1qnt(I)Hb8YsqPuCP0~B-;%q?
zaU~6gazC&+?@$_MjEIZ^)&VzAkV@(VGDJjHP+FZ(7$`LxBO-%=+kxk)VuSKRg0Vf6
z3BUqMmk%63fy-1dl^<{4b{7E?iKLAE<2&qlGYaSdt^=+IE}^vVQ*>9=`3E0vOHfq%
R>G}Ww002ovPDHLkV1h}}+wlMZ
diff --git a/catalogue/static/catalogue/img/carousel-right.png b/catalogue/static/catalogue/img/carousel-right.png
deleted file mode 100644
index 3987678a4884608a201cedfa6e6541f88b1393c1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1794
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