-
Notifications
You must be signed in to change notification settings - Fork 0
/
models.py
150 lines (110 loc) · 3.98 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
from copy import copy
from django.db import models
from django.db.models.query import QuerySet
from django.core.urlresolvers import reverse
from mptt.models import MPTTModel, TreeForeignKey
from model_utils import Choices
from model_utils.managers import PassThroughManager
from model_utils.fields import StatusField
from sorl.thumbnail import ImageField
from tinymce import models as tinymce_models
class SiteEntityQuerySet(QuerySet):
def live(self):
return self.filter(status=SiteEntity.STATUS.live)
class SiteEntity(models.Model):
STATUS = Choices(
('draft', 'Draft'),
('live', 'Live'),
)
title = models.CharField(max_length=255)
identifier = models.CharField(max_length=255, null=True, blank=True)
order = models.IntegerField(null=True, blank=True)
added = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = StatusField()
objects = PassThroughManager.for_queryset_class(SiteEntityQuerySet)()
def save(self, *args, **kwargs):
model = self.__class__
if self.order is None:
# Append
try:
last = model.objects.order_by('-order')[0]
self.order = last.order + 1
except IndexError:
# First row
self.order = 0
return super(SiteEntity, self).save(*args, **kwargs)
def __str__(self):
return self.title
def __unicode__(self):
return self.title
class Meta:
ordering = ['order']
abstract = True
class Displayable(SiteEntity):
body = tinymce_models.HTMLField(null=True, blank=True)
slug = models.SlugField(max_length=255)
class Meta:
ordering = ['order']
abstract = True
class Attachment(SiteEntity):
TYPE = Choices(
('image', 'Image'),
('video', 'Video'),
('misc', 'Miscellaneous')
)
type = models.CharField(max_length=45, choices=TYPE, default=TYPE.image)
image = ImageField(upload_to='uploads', null=True, blank=True)
file = models.FileField(upload_to='uploads', null=True, blank=True)
class Page(MPTTModel, Displayable):
template_override = models.CharField(max_length=255, null=True,
blank=True)
parent = TreeForeignKey('self', null=True, blank=True,
related_name='children')
url = models.CharField(max_length=255, null=True, blank=True)
objects = PassThroughManager.for_queryset_class(SiteEntityQuerySet)()
def save(self, *args, **kwargs):
old_url = copy(self.url)
self.update_url()
if self.url != old_url:
for child in self.children.all():
child.save()
return super(SiteEntity, self).save(*args, **kwargs)
def update_url(self, save=True):
self.url = self._url
@property
def _url(self):
if self.is_root_node():
return reverse('suave:page')
crumbs = []
for ancestor in self.get_ancestors():
if ancestor.is_root_node():
continue
crumbs.append(ancestor.slug)
crumbs.append(self.slug)
return reverse('suave:page', kwargs=dict(
url='/'.join(crumbs)))
class Meta:
ordering = ['order']
class Carousel(SiteEntity):
pass
class CarouselImage(models.Model):
carousel = models.ForeignKey(Carousel)
image = ImageField(upload_to='carousel_img')
description = models.TextField(blank=True)
order = models.IntegerField(default=0)
class Nav(SiteEntity):
items = models.ManyToManyField(Page, related_name='navs',
through='NavItem')
class NavItem(models.Model):
page = models.ForeignKey(Page, related_name='navitems')
nav = models.ForeignKey(Nav, related_name='navitems')
show_children = models.BooleanField(default=True)
order = models.IntegerField(default=0)
@property
def show_id(self):
return self.pk
def __unicode__(self):
return unicode(self.page)
class Meta:
ordering = ['order']