Opravy pro Django 2.0
Zatím jen část.
This commit is contained in:
parent
f89e696fe3
commit
a1731ef157
9 changed files with 78 additions and 54 deletions
|
@ -57,7 +57,7 @@ class Obrazek(models.Model):
|
|||
nazev = models.CharField('Název', max_length=50, blank=True, null=True)
|
||||
popis = models.TextField('Popis', blank=True, null=True)
|
||||
datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add=True)
|
||||
galerie = models.ForeignKey('Galerie', blank=True, null=True)
|
||||
galerie = models.ForeignKey('Galerie', blank=True, null=True, on_delete=models.SET_NULL)
|
||||
poradi = models.IntegerField('Pořadí', blank=True, null=True)
|
||||
|
||||
def __unicode__(self):
|
||||
|
@ -88,8 +88,10 @@ class Galerie(models.Model):
|
|||
popis = models.TextField('Popis', blank = True, null = True)
|
||||
titulni_obrazek = models.ForeignKey(Obrazek, blank = True, null = True, related_name = "+", on_delete = models.SET_NULL)
|
||||
zobrazit = models.IntegerField('Zobrazit?', default = ORG, choices = VIDITELNOST)
|
||||
galerie_up = models.ForeignKey('Galerie', blank = True, null = True)
|
||||
soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True)
|
||||
galerie_up = models.ForeignKey('Galerie', blank = True, null = True,
|
||||
on_delete=models.SET_NULL)
|
||||
soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True,
|
||||
on_delete=models.PROTECT)
|
||||
poradi = models.IntegerField('Pořadí', blank = True, null = True)
|
||||
|
||||
def __unicode__(self):
|
||||
|
|
|
@ -49,9 +49,8 @@ class KorekturovanePDF(models.Model):
|
|||
pdf = models.FileField(u'PDF', upload_to = generate_filename)
|
||||
|
||||
org = models.ForeignKey(Organizator, blank=True,
|
||||
help_text='Zodpovědný organizátor za obsah',
|
||||
null=True,
|
||||
default=None)
|
||||
help_text='Zodpovědný organizátor za obsah',
|
||||
null=True, default=None, on_delete=models.SET_NULL)
|
||||
|
||||
stran = models.IntegerField(u'počet stran', help_text='Počet stran PDF',
|
||||
default=0)
|
||||
|
@ -124,7 +123,7 @@ class Oprava(models.Model):
|
|||
#Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
pdf = models.ForeignKey(KorekturovanePDF, default=-1)
|
||||
pdf = models.ForeignKey(KorekturovanePDF, default=-1, on_delete=models.PROTECT)
|
||||
|
||||
strana = models.IntegerField(u'strana s opravou', help_text='Strana s opravou (od 0)')
|
||||
|
||||
|
@ -146,7 +145,7 @@ class Oprava(models.Model):
|
|||
|
||||
autor = models.ForeignKey(Organizator, blank = True,
|
||||
help_text='Autor opravy',
|
||||
null = True)
|
||||
null = True, on_delete=models.SET_NULL)
|
||||
|
||||
text = models.TextField(u'text opravy',blank = True, help_text='Text opravy')
|
||||
|
||||
|
@ -173,10 +172,10 @@ class Komentar(models.Model):
|
|||
|
||||
cas = models.DateTimeField(u'čas komentáře',default=timezone.now,help_text = 'Čas zadání komentáře')
|
||||
|
||||
oprava = models.ForeignKey(Oprava)
|
||||
oprava = models.ForeignKey(Oprava, on_delete=models.CASCADE)
|
||||
autor = models.ForeignKey(Organizator, blank = True,
|
||||
help_text = u'Autor komentáře',
|
||||
null = True)
|
||||
null = True, on_delete=models.SET_NULL)
|
||||
|
||||
text = models.TextField(u'text komentáře',blank = True, help_text='Text komentáře')
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ AUTHENTICATION_BACKENDS = (
|
|||
)
|
||||
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
MIDDLEWARE = (
|
||||
'reversion.middleware.RevisionMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
|
|
|
@ -10,7 +10,7 @@ import os.path
|
|||
# Import common settings
|
||||
from .settings_common import *
|
||||
|
||||
MIDDLEWARE_CLASSES += (
|
||||
MIDDLEWARE += (
|
||||
'debug_toolbar.middleware.DebugToolbarMiddleware',
|
||||
)
|
||||
|
||||
|
|
|
@ -25,7 +25,8 @@ class Seznam(models.Model):
|
|||
ordering = ['soustredeni', 'stav']
|
||||
|
||||
id = models.AutoField(primary_key = True)
|
||||
soustredeni = models.ForeignKey(Soustredeni,null = True, default = None)
|
||||
soustredeni = models.ForeignKey(Soustredeni,null = True, default = None,
|
||||
on_delete=models.PROTECT)
|
||||
stav = models.IntegerField('Stav',choices=STAV_CHOICES,default = STAV_NAVRH)
|
||||
|
||||
def __str__(self):
|
||||
|
@ -55,7 +56,7 @@ class Prednaska(models.Model):
|
|||
|
||||
id = models.AutoField(primary_key = True)
|
||||
nazev = models.CharField('Název', max_length = 300)
|
||||
org = models.ForeignKey(Organizator)
|
||||
org = models.ForeignKey(Organizator, on_delete=models.PROTECT)
|
||||
popis = models.TextField('Popis pro orgy',null = True, blank = True,help_text = 'Neveřejný popis pro ostatní orgy')
|
||||
anotace = models.TextField('Anotace',null = True, blank = True, help_text = 'Veřejná anotace v hlasování')
|
||||
obtiznost = models.IntegerField('Obtížnost', choices=CHOICES_OBTIZNOST)
|
||||
|
@ -75,10 +76,10 @@ class Hlasovani(models.Model):
|
|||
verbose_name_plural = 'Hlasování'
|
||||
ordering = ['ucastnik', 'prednaska']
|
||||
id = models.AutoField(primary_key = True)
|
||||
prednaska = models.ForeignKey(Prednaska)
|
||||
prednaska = models.ForeignKey(Prednaska, on_delete=models.CASCADE)
|
||||
body = models.IntegerField('Body', default = 0, choices = CHOICES_BODY)
|
||||
ucastnik = models.CharField('Účastník', max_length = 100)
|
||||
seznam = models.ForeignKey(Seznam)
|
||||
seznam = models.ForeignKey(Seznam,null=True,on_delete=models.SET_NULL)
|
||||
|
||||
def __str__(self):
|
||||
return force_unicode("{} dal {} bodů {} v seznamu {}".format(self.ucastnik,
|
||||
|
|
|
@ -9,7 +9,7 @@ from ckeditor_uploader.widgets import CKEditorUploadingWidget
|
|||
from django.db.models import Count
|
||||
from django.db import models
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import datetime, django
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from django.http import HttpResponse
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
from django.views import generic
|
||||
from django.utils.encoding import force_text
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ from django.conf import settings
|
|||
from django.utils.encoding import python_2_unicode_compatible
|
||||
from django.utils.encoding import force_text
|
||||
from django.utils.text import slugify
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
from django.core.cache import cache
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.utils.text import get_valid_filename
|
||||
|
@ -64,7 +64,7 @@ class Osoba(SeminarModelBase):
|
|||
|
||||
# User, pokud má na webu účet
|
||||
user = models.OneToOneField(settings.AUTH_USER_MODEL, blank=True, null=True,
|
||||
verbose_name='uživatel')
|
||||
verbose_name='uživatel', on_delete=models.DO_NOTHING)
|
||||
|
||||
# Pohlaví. Že ho neznáme se snad nestane (a ušetří to práci při programování)
|
||||
pohlavi_muz = models.BooleanField('pohlaví (muž)', default=False)
|
||||
|
@ -180,7 +180,7 @@ class Skola(SeminarModelBase):
|
|||
help_text='Neveřejná poznámka ke škole (plain text)')
|
||||
|
||||
kontaktni_osoba = models.ForeignKey(Osoba, verbose_name='Kontaktní osoba',
|
||||
blank=True, null=True)
|
||||
blank=True, null=True, on_delete=models.SET_NULL)
|
||||
|
||||
def __str__(self):
|
||||
return '{}, {}, {}'.format(self.nazev, self.ulice, self.mesto)
|
||||
|
@ -199,7 +199,8 @@ class Prijemce(SeminarModelBase):
|
|||
help_text='Neveřejná poznámka k příemci čísel (plain text)')
|
||||
|
||||
osoba = models.OneToOneField(Osoba, verbose_name='komu', blank=False, null=False,
|
||||
help_text='Které osobě či na jakou adresu se mají zasílat čísla')
|
||||
help_text='Které osobě či na jakou adresu se mají zasílat čísla',
|
||||
on_delete=models.CASCADE)
|
||||
|
||||
# FIXME: možná chceme něco jako vazbu na osobu XOR školu a počet kusů k zaslání
|
||||
# FIXME: a možná taky posílání na mail a možná taky přes něj chceme posílat i řešitelům
|
||||
|
@ -220,9 +221,12 @@ class Resitel(SeminarModelBase):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
osoba = models.OneToOneField(Osoba, blank=False, null=True, verbose_name='osoba') # FIXME opravit po prvni migraci
|
||||
osoba = models.OneToOneField(Osoba, blank=False, null=True, verbose_name='osoba',
|
||||
on_delete=models.SET_NULL) # FIXME opravit po prvni migraci
|
||||
|
||||
|
||||
skola = models.ForeignKey(Skola, blank=True, null=True, verbose_name='škola')
|
||||
skola = models.ForeignKey(Skola, blank=True, null=True, verbose_name='škola',
|
||||
on_delete=models.SET_NULL)
|
||||
|
||||
# Očekávaný rok maturity a vyřazení z aktivních řešitelů
|
||||
rok_maturity = models.IntegerField('rok maturity', blank=True, null=True)
|
||||
|
@ -378,7 +382,8 @@ class Cislo(SeminarModelBase):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='cisla', db_index=True)
|
||||
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='cisla',
|
||||
db_index=True,on_delete=models.PROTECT)
|
||||
|
||||
cislo = models.CharField('název čísla', max_length=32, db_index=True,
|
||||
help_text='Většinou jen "1", vyjímečně "7-8", lexikograficky určuje pořadí v ročníku!')
|
||||
|
@ -456,7 +461,8 @@ class Organizator(SeminarModelBase):
|
|||
# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu
|
||||
|
||||
osoba = models.OneToOneField(Osoba, verbose_name='osoba', related_name='org',
|
||||
help_text='osobní údaje organizátora', null=True, blank=False) #FIXME opravit po migraci
|
||||
help_text='osobní údaje organizátora', null=True, blank=False,
|
||||
on_delete=models.SET_NULL) #FIXME opravit po migraci
|
||||
|
||||
vytvoreno = models.DateTimeField(
|
||||
'Vytvořeno',
|
||||
|
@ -506,7 +512,8 @@ class Soustredeni(SeminarModelBase):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='soustredeni')
|
||||
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='soustredeni',
|
||||
on_delete=models.PROTECT)
|
||||
|
||||
datum_zacatku = models.DateField('datum začátku', blank=True, null=True,
|
||||
help_text='První den soustředění')
|
||||
|
@ -575,7 +582,8 @@ class Problem(SeminarModelBase):
|
|||
|
||||
# Problém má podproblémy
|
||||
nadproblem = models.ForeignKey('self', verbose_name='nadřazený problém',
|
||||
related_name='nadproblem_%(class)s', null=True, blank=True)
|
||||
related_name='nadproblem_%(class)s', null=True, blank=True,
|
||||
on_delete=models.SET_NULL)
|
||||
|
||||
STAV_NAVRH = 'navrh'
|
||||
STAV_ZADANY = 'zadany'
|
||||
|
@ -596,10 +604,12 @@ class Problem(SeminarModelBase):
|
|||
help_text='Neveřejný návrh úlohy, návrh řešení, text zadání, poznámky ...')
|
||||
|
||||
autor = models.ForeignKey(Organizator, verbose_name='autor problému',
|
||||
related_name='autor_problemu_%(class)s', null=True, blank=True)
|
||||
related_name='autor_problemu_%(class)s', null=True, blank=True,
|
||||
on_delete=models.SET_NULL)
|
||||
|
||||
garant = models.ForeignKey(Organizator, verbose_name='garant zadaného problému',
|
||||
related_name='garant_problemu_%(class)s', null=True, blank=True)
|
||||
related_name='garant_problemu_%(class)s', null=True, blank=True,
|
||||
on_delete=models.SET_NULL)
|
||||
|
||||
opravovatele = models.ManyToManyField(Organizator, verbose_name='opravovatelé',
|
||||
blank=True, related_name='opravovatele_%(class)s')
|
||||
|
@ -662,7 +672,8 @@ class Tema(Problem):
|
|||
tema_typ = models.CharField('Typ tématu', max_length=16, choices=TEMA_CHOICES,
|
||||
blank=False, default=TEMA_TEMA)
|
||||
|
||||
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník',blank=True, null=True)
|
||||
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník',blank=True, null=True,
|
||||
on_delete=models.PROTECT)
|
||||
|
||||
def kod_v_rocniku(self):
|
||||
if self.stav == 'zadany':
|
||||
|
@ -677,7 +688,8 @@ class Clanek(Problem):
|
|||
verbose_name = 'Článek'
|
||||
verbose_name_plural = 'Články'
|
||||
|
||||
cislo = models.ForeignKey(Cislo, verbose_name='číslo', blank=True, null=True)
|
||||
cislo = models.ForeignKey(Cislo, verbose_name='číslo', blank=True, null=True,
|
||||
on_delete=models.PROTECT)
|
||||
def kod_v_rocniku(self):
|
||||
if self.stav == 'zadany':
|
||||
# Nemělo by být potřeba
|
||||
|
@ -708,14 +720,15 @@ class Uloha(Problem):
|
|||
verbose_name_plural = 'Úlohy'
|
||||
|
||||
cislo_zadani = models.ForeignKey(Cislo, verbose_name='číslo zadání', blank=True,
|
||||
null=True, related_name='zadane_ulohy')
|
||||
null=True, related_name='zadane_ulohy', on_delete=models.PROTECT)
|
||||
|
||||
cislo_deadline = models.ForeignKey(Cislo, verbose_name='číslo deadlinu', blank=True,
|
||||
null=True, related_name='deadlinove_ulohy')
|
||||
null=True, related_name='deadlinove_ulohy', on_delete=models.PROTECT)
|
||||
|
||||
cislo_reseni = models.ForeignKey(Cislo, verbose_name='číslo řešení', blank=True,
|
||||
null=True, related_name='resene_ulohy',
|
||||
help_text='Číslo s řešením úlohy, jen pro úlohy')
|
||||
help_text='Číslo s řešením úlohy, jen pro úlohy',
|
||||
on_delete=models.PROTECT)
|
||||
|
||||
max_body = models.DecimalField(max_digits=8, decimal_places=1, verbose_name='maximum bodů',
|
||||
blank=True, null=True)
|
||||
|
@ -765,7 +778,8 @@ class Reseni(SeminarModelBase):
|
|||
default=FORMA_EMAIL)
|
||||
|
||||
text_cely = models.OneToOneField(Text, verbose_name='Plná verze textu řešení',
|
||||
blank=True, null=True, related_name="reseni_cely_set")
|
||||
blank=True, null=True, related_name="reseni_cely_set",
|
||||
on_delete=models.SET_NULL)
|
||||
|
||||
text_zkraceny = models.ManyToManyField(Text, verbose_name='zkrácené verze řešení',
|
||||
help_text='Seznam úryvků z řešení',related_name="reseni_zkraceny_set")
|
||||
|
@ -801,11 +815,11 @@ class Hodnoceni(SeminarModelBase):
|
|||
blank=False, null=False)
|
||||
|
||||
cislo_body = models.ForeignKey(Cislo, verbose_name='číslo pro body',
|
||||
related_name='hodnoceni', blank=False, null=False)
|
||||
related_name='hodnoceni', blank=False, null=False, on_delete=models.PROTECT)
|
||||
|
||||
reseni = models.ForeignKey(Reseni, verbose_name='řešení')
|
||||
reseni = models.ForeignKey(Reseni, verbose_name='řešení', on_delete=models.CASCADE)
|
||||
|
||||
problem = models.ForeignKey(Problem, verbose_name='problém')
|
||||
problem = models.ForeignKey(Problem, verbose_name='problém', on_delete=models.PROTECT)
|
||||
|
||||
def __str__(self):
|
||||
return "{}, {}, {}".format(self.problem, self.reseni, self.body)
|
||||
|
@ -856,7 +870,8 @@ class PrilohaReseni(SeminarModelBase):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
reseni = models.ForeignKey(Reseni, verbose_name='řešení', related_name='prilohy')
|
||||
reseni = models.ForeignKey(Reseni, verbose_name='řešení', related_name='prilohy',
|
||||
on_delete=models.CASCADE)
|
||||
|
||||
vytvoreno = models.DateTimeField('vytvořeno', default=timezone.now, blank=True, editable=False)
|
||||
|
||||
|
@ -887,7 +902,8 @@ class Pohadka(SeminarModelBase):
|
|||
|
||||
# Při nahrávání z TeXu není vyplnění vyžadováno, v adminu je
|
||||
null=True,
|
||||
blank=False
|
||||
blank=False,
|
||||
on_delete=models.SET_NULL
|
||||
)
|
||||
|
||||
vytvoreno = models.DateTimeField(
|
||||
|
@ -915,9 +931,10 @@ class Soustredeni_Ucastnici(SeminarModelBase):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
resitel = models.ForeignKey(Resitel, verbose_name='řešitel')
|
||||
resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT)
|
||||
|
||||
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění')
|
||||
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění',
|
||||
on_delete=models.PROTECT)
|
||||
|
||||
poznamka = models.TextField('neveřejná poznámka', blank=True,
|
||||
help_text='Neveřejná poznámka k účasti (plain text)')
|
||||
|
@ -939,9 +956,11 @@ class Soustredeni_Organizatori(SeminarModelBase):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
organizator = models.ForeignKey(Organizator, verbose_name='organizátor')
|
||||
organizator = models.ForeignKey(Organizator, verbose_name='organizátor',
|
||||
on_delete=models.PROTECT)
|
||||
|
||||
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění')
|
||||
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění',
|
||||
on_delete=models.PROTECT)
|
||||
|
||||
poznamka = models.TextField('neveřejná poznámka', blank=True,
|
||||
help_text='Neveřejná poznámka k účasti organizátora (plain text)')
|
||||
|
@ -1018,9 +1037,9 @@ class Reseni_Resitele(models.Model):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
resitele = models.ForeignKey(Resitel, verbose_name='řešitel')
|
||||
resitele = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT)
|
||||
|
||||
reseni = models.ForeignKey(Reseni, verbose_name='řešení')
|
||||
reseni = models.ForeignKey(Reseni, verbose_name='řešení', on_delete=models.CASCADE)
|
||||
|
||||
# podil - jakou merou se ktery resitel podilel na danem reseni
|
||||
# - pouziti v budoucnu, pokud by resitele nemeli dostat vsichni stejne bodu za spolecne reseni
|
||||
|
@ -1041,9 +1060,9 @@ class Konfery_Ucastnici(models.Model):
|
|||
# Interní ID
|
||||
id = models.AutoField(primary_key = True)
|
||||
|
||||
resitel = models.ForeignKey(Resitel, verbose_name='řešitel')
|
||||
resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT)
|
||||
|
||||
konfera = models.ForeignKey(Konfera, verbose_name='konfera')
|
||||
konfera = models.ForeignKey(Konfera, verbose_name='konfera', on_delete=models.CASCADE)
|
||||
|
||||
poznamka = models.TextField('neveřejná poznámka', blank=True,
|
||||
help_text='Neveřejná poznámka k účasti (plain text)')
|
||||
|
@ -1065,7 +1084,8 @@ class Obrazek(SeminarModelBase):
|
|||
null=True, blank=True)
|
||||
|
||||
text = models.ForeignKey(Text, verbose_name='text',
|
||||
help_text='text, ve kterém se obrázek vyskytuje', null=False, blank=False)
|
||||
help_text='text, ve kterém se obrázek vyskytuje',
|
||||
null=False, blank=False, on_delete=models.CASCADE)
|
||||
|
||||
do_cisla_barevny = models.FileField('barevný obrázek do čísla',
|
||||
help_text = 'Barevná verze obrázku do čísla',
|
||||
|
@ -1284,10 +1304,11 @@ class Nastaveni(SingletonModel):
|
|||
db_table = 'seminar_nastaveni'
|
||||
verbose_name = 'Nastavení semináře'
|
||||
|
||||
aktualni_rocnik = models.ForeignKey(Rocnik, verbose_name='aktuální ročník', null=False)
|
||||
aktualni_rocnik = models.ForeignKey(Rocnik, verbose_name='aktuální ročník',
|
||||
null=False, on_delete=models.PROTECT)
|
||||
|
||||
aktualni_cislo = models.ForeignKey(Cislo, verbose_name='poslední vydané číslo',
|
||||
null=False)
|
||||
null=False, on_delete=models.PROTECT)
|
||||
|
||||
def __str__(self):
|
||||
return 'Nastavení semináře'
|
||||
|
@ -1321,7 +1342,8 @@ class Novinky(models.Model):
|
|||
],
|
||||
options={'quality': 95})
|
||||
|
||||
autor = models.ForeignKey(Organizator, verbose_name='Autor novinky', null=True)
|
||||
autor = models.ForeignKey(Organizator, verbose_name='Autor novinky', null=True,
|
||||
on_delete=models.SET_NULL)
|
||||
|
||||
zverejneno = models.BooleanField('Zveřejněno', default=False)
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, JsonResponse
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.urls import reverse
|
||||
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
|
||||
from django.views import generic
|
||||
from django.utils.translation import ugettext as _
|
||||
|
|
Loading…
Reference in a new issue