mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-09 19:40:19 +00:00
All: Apply Black coding rules
This commit is contained in:
@ -21,4 +21,3 @@
|
||||
# Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
#
|
||||
|
||||
|
@ -41,4 +41,3 @@ admin.site.register(News, NewsAdmin)
|
||||
admin.site.register(Weekmail, WeekmailAdmin)
|
||||
admin.site.register(Screen)
|
||||
admin.site.register(Poster)
|
||||
|
||||
|
@ -6,17 +6,37 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Sith',
|
||||
name="Sith",
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)),
|
||||
('alert_msg', models.TextField(default='', verbose_name='alert message', blank=True)),
|
||||
('info_msg', models.TextField(default='', verbose_name='info message', blank=True)),
|
||||
('index_page', models.TextField(default='', verbose_name='index page', blank=True)),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
serialize=False,
|
||||
primary_key=True,
|
||||
),
|
||||
),
|
||||
(
|
||||
"alert_msg",
|
||||
models.TextField(
|
||||
default="", verbose_name="alert message", blank=True
|
||||
),
|
||||
),
|
||||
(
|
||||
"info_msg",
|
||||
models.TextField(
|
||||
default="", verbose_name="info message", blank=True
|
||||
),
|
||||
),
|
||||
(
|
||||
"index_page",
|
||||
models.TextField(default="", verbose_name="index page", blank=True),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
]
|
||||
|
@ -8,33 +8,100 @@ from django.conf import settings
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('club', '0005_auto_20161120_1149'),
|
||||
("club", "0005_auto_20161120_1149"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('com', '0001_initial'),
|
||||
("com", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='News',
|
||||
name="News",
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, auto_created=True, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=64, verbose_name='title')),
|
||||
('summary', models.TextField(verbose_name='summary')),
|
||||
('content', models.TextField(verbose_name='content')),
|
||||
('type', models.CharField(choices=[('NOTICE', 'Notice'), ('EVENT', 'Event'), ('WEEKLY', 'Weekly'), ('CALL', 'Call')], default='EVENT', max_length=16, verbose_name='type')),
|
||||
('is_moderated', models.BooleanField(default=False, verbose_name='is moderated')),
|
||||
('author', models.ForeignKey(related_name='owned_news', to=settings.AUTH_USER_MODEL, verbose_name='author')),
|
||||
('club', models.ForeignKey(related_name='news', to='club.Club', verbose_name='club')),
|
||||
('moderator', models.ForeignKey(related_name='moderated_news', null=True, to=settings.AUTH_USER_MODEL, verbose_name='moderator')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
auto_created=True,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
("title", models.CharField(max_length=64, verbose_name="title")),
|
||||
("summary", models.TextField(verbose_name="summary")),
|
||||
("content", models.TextField(verbose_name="content")),
|
||||
(
|
||||
"type",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("NOTICE", "Notice"),
|
||||
("EVENT", "Event"),
|
||||
("WEEKLY", "Weekly"),
|
||||
("CALL", "Call"),
|
||||
],
|
||||
default="EVENT",
|
||||
max_length=16,
|
||||
verbose_name="type",
|
||||
),
|
||||
),
|
||||
(
|
||||
"is_moderated",
|
||||
models.BooleanField(default=False, verbose_name="is moderated"),
|
||||
),
|
||||
(
|
||||
"author",
|
||||
models.ForeignKey(
|
||||
related_name="owned_news",
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
verbose_name="author",
|
||||
),
|
||||
),
|
||||
(
|
||||
"club",
|
||||
models.ForeignKey(
|
||||
related_name="news", to="club.Club", verbose_name="club"
|
||||
),
|
||||
),
|
||||
(
|
||||
"moderator",
|
||||
models.ForeignKey(
|
||||
related_name="moderated_news",
|
||||
null=True,
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
verbose_name="moderator",
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='NewsDate',
|
||||
name="NewsDate",
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, auto_created=True, verbose_name='ID')),
|
||||
('start_date', models.DateTimeField(null=True, blank=True, verbose_name='start_date')),
|
||||
('end_date', models.DateTimeField(null=True, blank=True, verbose_name='end_date')),
|
||||
('news', models.ForeignKey(related_name='dates', to='com.News', verbose_name='news_date')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
auto_created=True,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"start_date",
|
||||
models.DateTimeField(
|
||||
null=True, blank=True, verbose_name="start_date"
|
||||
),
|
||||
),
|
||||
(
|
||||
"end_date",
|
||||
models.DateTimeField(
|
||||
null=True, blank=True, verbose_name="end_date"
|
||||
),
|
||||
),
|
||||
(
|
||||
"news",
|
||||
models.ForeignKey(
|
||||
related_name="dates", to="com.News", verbose_name="news_date"
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
@ -8,42 +8,81 @@ from django.conf import settings
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('club', '0006_auto_20161229_0040'),
|
||||
("club", "0006_auto_20161229_0040"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('com', '0002_news_newsdate'),
|
||||
("com", "0002_news_newsdate"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Weekmail',
|
||||
name="Weekmail",
|
||||
fields=[
|
||||
('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
|
||||
('title', models.CharField(max_length=64, verbose_name='title', blank=True)),
|
||||
('intro', models.TextField(verbose_name='intro', blank=True)),
|
||||
('joke', models.TextField(verbose_name='joke', blank=True)),
|
||||
('protip', models.TextField(verbose_name='protip', blank=True)),
|
||||
('conclusion', models.TextField(verbose_name='conclusion', blank=True)),
|
||||
('sent', models.BooleanField(verbose_name='sent', default=False)),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
serialize=False,
|
||||
primary_key=True,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
(
|
||||
"title",
|
||||
models.CharField(max_length=64, verbose_name="title", blank=True),
|
||||
),
|
||||
("intro", models.TextField(verbose_name="intro", blank=True)),
|
||||
("joke", models.TextField(verbose_name="joke", blank=True)),
|
||||
("protip", models.TextField(verbose_name="protip", blank=True)),
|
||||
("conclusion", models.TextField(verbose_name="conclusion", blank=True)),
|
||||
("sent", models.BooleanField(verbose_name="sent", default=False)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-id'],
|
||||
},
|
||||
options={"ordering": ["-id"]},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='WeekmailArticle',
|
||||
name="WeekmailArticle",
|
||||
fields=[
|
||||
('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
|
||||
('title', models.CharField(max_length=64, verbose_name='title')),
|
||||
('content', models.TextField(verbose_name='content')),
|
||||
('rank', models.IntegerField(verbose_name='rank', default=-1)),
|
||||
('author', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='author', related_name='owned_weekmail_articles')),
|
||||
('club', models.ForeignKey(to='club.Club', verbose_name='club', related_name='weekmail_articles')),
|
||||
('weekmail', models.ForeignKey(to='com.Weekmail', verbose_name='weekmail', related_name='articles', null=True)),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
serialize=False,
|
||||
primary_key=True,
|
||||
verbose_name="ID",
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("title", models.CharField(max_length=64, verbose_name="title")),
|
||||
("content", models.TextField(verbose_name="content")),
|
||||
("rank", models.IntegerField(verbose_name="rank", default=-1)),
|
||||
(
|
||||
"author",
|
||||
models.ForeignKey(
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
verbose_name="author",
|
||||
related_name="owned_weekmail_articles",
|
||||
),
|
||||
),
|
||||
(
|
||||
"club",
|
||||
models.ForeignKey(
|
||||
to="club.Club",
|
||||
verbose_name="club",
|
||||
related_name="weekmail_articles",
|
||||
),
|
||||
),
|
||||
(
|
||||
"weekmail",
|
||||
models.ForeignKey(
|
||||
to="com.Weekmail",
|
||||
verbose_name="weekmail",
|
||||
related_name="articles",
|
||||
null=True,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='sith',
|
||||
name='weekmail_destinations',
|
||||
field=models.TextField(verbose_name='weekmail destinations', default=''),
|
||||
model_name="sith",
|
||||
name="weekmail_destinations",
|
||||
field=models.TextField(verbose_name="weekmail destinations", default=""),
|
||||
),
|
||||
]
|
||||
|
@ -9,36 +9,78 @@ from django.conf import settings
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('club', '0010_auto_20170912_2028'),
|
||||
("club", "0010_auto_20170912_2028"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('com', '0003_auto_20170115_2300'),
|
||||
("com", "0003_auto_20170115_2300"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Poster',
|
||||
name="Poster",
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
||||
('name', models.CharField(verbose_name='name', max_length=128, default='')),
|
||||
('file', models.ImageField(verbose_name='file', upload_to='com/posters')),
|
||||
('date_begin', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('date_end', models.DateTimeField(blank=True, null=True)),
|
||||
('display_time', models.IntegerField(verbose_name='display time', default=30)),
|
||||
('is_moderated', models.BooleanField(verbose_name='is moderated', default=False)),
|
||||
('club', models.ForeignKey(verbose_name='club', related_name='posters', to='club.Club')),
|
||||
('moderator', models.ForeignKey(verbose_name='moderator', blank=True, null=True, related_name='moderated_posters', to=settings.AUTH_USER_MODEL)),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
verbose_name="ID",
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
(
|
||||
"name",
|
||||
models.CharField(verbose_name="name", max_length=128, default=""),
|
||||
),
|
||||
(
|
||||
"file",
|
||||
models.ImageField(verbose_name="file", upload_to="com/posters"),
|
||||
),
|
||||
("date_begin", models.DateTimeField(default=django.utils.timezone.now)),
|
||||
("date_end", models.DateTimeField(blank=True, null=True)),
|
||||
(
|
||||
"display_time",
|
||||
models.IntegerField(verbose_name="display time", default=30),
|
||||
),
|
||||
(
|
||||
"is_moderated",
|
||||
models.BooleanField(verbose_name="is moderated", default=False),
|
||||
),
|
||||
(
|
||||
"club",
|
||||
models.ForeignKey(
|
||||
verbose_name="club", related_name="posters", to="club.Club"
|
||||
),
|
||||
),
|
||||
(
|
||||
"moderator",
|
||||
models.ForeignKey(
|
||||
verbose_name="moderator",
|
||||
blank=True,
|
||||
null=True,
|
||||
related_name="moderated_posters",
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Screen',
|
||||
name="Screen",
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
|
||||
('name', models.CharField(verbose_name='name', max_length=128)),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
verbose_name="ID",
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
auto_created=True,
|
||||
),
|
||||
),
|
||||
("name", models.CharField(verbose_name="name", max_length=128)),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='poster',
|
||||
name='screens',
|
||||
field=models.ManyToManyField(related_name='posters', to='com.Screen'),
|
||||
model_name="poster",
|
||||
name="screens",
|
||||
field=models.ManyToManyField(related_name="posters", to="com.Screen"),
|
||||
),
|
||||
]
|
||||
|
@ -6,14 +6,12 @@ from django.db import migrations, models
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('com', '0004_auto_20171221_1614'),
|
||||
]
|
||||
dependencies = [("com", "0004_auto_20171221_1614")]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='poster',
|
||||
name='display_time',
|
||||
field=models.IntegerField(verbose_name='display time', default=15),
|
||||
),
|
||||
model_name="poster",
|
||||
name="display_time",
|
||||
field=models.IntegerField(verbose_name="display time", default=15),
|
||||
)
|
||||
]
|
||||
|
138
com/models.py
138
com/models.py
@ -40,10 +40,9 @@ from core.models import User, Preferences, RealGroup, Notification, SithFile
|
||||
from club.models import Club
|
||||
|
||||
|
||||
|
||||
|
||||
class Sith(models.Model):
|
||||
"""A one instance class storing all the modifiable infos"""
|
||||
|
||||
alert_msg = models.TextField(_("alert message"), default="", blank=True)
|
||||
info_msg = models.TextField(_("info message"), default="", blank=True)
|
||||
index_page = models.TextField(_("index page"), default="", blank=True)
|
||||
@ -57,23 +56,30 @@ class Sith(models.Model):
|
||||
|
||||
|
||||
NEWS_TYPES = [
|
||||
('NOTICE', _('Notice')),
|
||||
('EVENT', _('Event')),
|
||||
('WEEKLY', _('Weekly')),
|
||||
('CALL', _('Call')),
|
||||
("NOTICE", _("Notice")),
|
||||
("EVENT", _("Event")),
|
||||
("WEEKLY", _("Weekly")),
|
||||
("CALL", _("Call")),
|
||||
]
|
||||
|
||||
|
||||
class News(models.Model):
|
||||
"""The news class"""
|
||||
|
||||
title = models.CharField(_("title"), max_length=64)
|
||||
summary = models.TextField(_("summary"))
|
||||
content = models.TextField(_("content"))
|
||||
type = models.CharField(_("type"), max_length=16, choices=NEWS_TYPES, default="EVENT")
|
||||
type = models.CharField(
|
||||
_("type"), max_length=16, choices=NEWS_TYPES, default="EVENT"
|
||||
)
|
||||
club = models.ForeignKey(Club, related_name="news", verbose_name=_("club"))
|
||||
author = models.ForeignKey(User, related_name="owned_news", verbose_name=_("author"))
|
||||
author = models.ForeignKey(
|
||||
User, related_name="owned_news", verbose_name=_("author")
|
||||
)
|
||||
is_moderated = models.BooleanField(_("is moderated"), default=False)
|
||||
moderator = models.ForeignKey(User, related_name="moderated_news", verbose_name=_("moderator"), null=True)
|
||||
moderator = models.ForeignKey(
|
||||
User, related_name="moderated_news", verbose_name=_("moderator"), null=True
|
||||
)
|
||||
|
||||
def is_owned_by(self, user):
|
||||
return user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID) or user == self.author
|
||||
@ -85,7 +91,7 @@ class News(models.Model):
|
||||
return self.is_moderated or user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('com:news_detail', kwargs={'news_id': self.id})
|
||||
return reverse("com:news_detail", kwargs={"news_id": self.id})
|
||||
|
||||
def get_full_url(self):
|
||||
return "https://%s%s" % (settings.SITH_URL, self.get_absolute_url())
|
||||
@ -95,15 +101,28 @@ class News(models.Model):
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
super(News, self).save(*args, **kwargs)
|
||||
for u in RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID).first().users.all():
|
||||
Notification(user=u, url=reverse("com:news_admin_list"),
|
||||
type="NEWS_MODERATION", param="1").save()
|
||||
for u in (
|
||||
RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
.first()
|
||||
.users.all()
|
||||
):
|
||||
Notification(
|
||||
user=u,
|
||||
url=reverse("com:news_admin_list"),
|
||||
type="NEWS_MODERATION",
|
||||
param="1",
|
||||
).save()
|
||||
|
||||
|
||||
def news_notification_callback(notif):
|
||||
count = News.objects.filter(
|
||||
Q(dates__start_date__gt=timezone.now(), is_moderated=False) |
|
||||
Q(type="NOTICE", is_moderated=False)
|
||||
).distinct().count()
|
||||
count = (
|
||||
News.objects.filter(
|
||||
Q(dates__start_date__gt=timezone.now(), is_moderated=False)
|
||||
| Q(type="NOTICE", is_moderated=False)
|
||||
)
|
||||
.distinct()
|
||||
.count()
|
||||
)
|
||||
if count:
|
||||
notif.viewed = False
|
||||
notif.param = "%s" % count
|
||||
@ -111,6 +130,7 @@ def news_notification_callback(notif):
|
||||
else:
|
||||
notif.viewed = True
|
||||
|
||||
|
||||
class NewsDate(models.Model):
|
||||
"""
|
||||
A date class, useful for weekly events, or for events that just have no date
|
||||
@ -118,9 +138,10 @@ class NewsDate(models.Model):
|
||||
This class allows more flexibilty managing the dates related to a news, particularly when this news is weekly, since
|
||||
we don't have to make copies
|
||||
"""
|
||||
|
||||
news = models.ForeignKey(News, related_name="dates", verbose_name=_("news_date"))
|
||||
start_date = models.DateTimeField(_('start_date'), null=True, blank=True)
|
||||
end_date = models.DateTimeField(_('end_date'), null=True, blank=True)
|
||||
start_date = models.DateTimeField(_("start_date"), null=True, blank=True)
|
||||
end_date = models.DateTimeField(_("end_date"), null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return "%s: %s - %s" % (self.news.title, self.start_date, self.end_date)
|
||||
@ -130,6 +151,7 @@ class Weekmail(models.Model):
|
||||
"""
|
||||
The weekmail class
|
||||
"""
|
||||
|
||||
title = models.CharField(_("title"), max_length=64, blank=True)
|
||||
intro = models.TextField(_("intro"), blank=True)
|
||||
joke = models.TextField(_("joke"), blank=True)
|
||||
@ -138,16 +160,21 @@ class Weekmail(models.Model):
|
||||
sent = models.BooleanField(_("sent"), default=False)
|
||||
|
||||
class Meta:
|
||||
ordering = ['-id']
|
||||
ordering = ["-id"]
|
||||
|
||||
def send(self):
|
||||
dest = [i[0] for i in Preferences.objects.filter(receive_weekmail=True).values_list('user__email')]
|
||||
dest = [
|
||||
i[0]
|
||||
for i in Preferences.objects.filter(receive_weekmail=True).values_list(
|
||||
"user__email"
|
||||
)
|
||||
]
|
||||
with transaction.atomic():
|
||||
email = EmailMultiAlternatives(
|
||||
subject=self.title,
|
||||
body=self.render_text(),
|
||||
from_email=settings.SITH_COM_EMAIL,
|
||||
to=Sith.objects.first().weekmail_destinations.split(' '),
|
||||
to=Sith.objects.first().weekmail_destinations.split(" "),
|
||||
bcc=dest,
|
||||
)
|
||||
email.attach_alternative(self.render_html(), "text/html")
|
||||
@ -157,14 +184,14 @@ class Weekmail(models.Model):
|
||||
Weekmail().save()
|
||||
|
||||
def render_text(self):
|
||||
return render(None, "com/weekmail_renderer_text.jinja", context={
|
||||
'weekmail': self,
|
||||
}).content.decode('utf-8')
|
||||
return render(
|
||||
None, "com/weekmail_renderer_text.jinja", context={"weekmail": self}
|
||||
).content.decode("utf-8")
|
||||
|
||||
def render_html(self):
|
||||
return render(None, "com/weekmail_renderer_html.jinja", context={
|
||||
'weekmail': self,
|
||||
}).content.decode('utf-8')
|
||||
return render(
|
||||
None, "com/weekmail_renderer_html.jinja", context={"weekmail": self}
|
||||
).content.decode("utf-8")
|
||||
|
||||
def get_banner(self):
|
||||
return "http://" + settings.SITH_URL + static("com/img/weekmail_bannerA18.jpg")
|
||||
@ -180,12 +207,18 @@ class Weekmail(models.Model):
|
||||
|
||||
|
||||
class WeekmailArticle(models.Model):
|
||||
weekmail = models.ForeignKey(Weekmail, related_name="articles", verbose_name=_("weekmail"), null=True)
|
||||
weekmail = models.ForeignKey(
|
||||
Weekmail, related_name="articles", verbose_name=_("weekmail"), null=True
|
||||
)
|
||||
title = models.CharField(_("title"), max_length=64)
|
||||
content = models.TextField(_("content"))
|
||||
author = models.ForeignKey(User, related_name="owned_weekmail_articles", verbose_name=_("author"))
|
||||
club = models.ForeignKey(Club, related_name="weekmail_articles", verbose_name=_("club"))
|
||||
rank = models.IntegerField(_('rank'), default=-1)
|
||||
author = models.ForeignKey(
|
||||
User, related_name="owned_weekmail_articles", verbose_name=_("author")
|
||||
)
|
||||
club = models.ForeignKey(
|
||||
Club, related_name="weekmail_articles", verbose_name=_("club")
|
||||
)
|
||||
rank = models.IntegerField(_("rank"), default=-1)
|
||||
|
||||
def is_owned_by(self, user):
|
||||
return user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
@ -199,7 +232,9 @@ class Screen(models.Model):
|
||||
|
||||
def active_posters(self):
|
||||
now = timezone.now()
|
||||
return self.posters.filter(is_moderated=True, date_begin__lte=now).filter(Q(date_end__isnull=True) | Q(date_end__gte=now))
|
||||
return self.posters.filter(is_moderated=True, date_begin__lte=now).filter(
|
||||
Q(date_end__isnull=True) | Q(date_end__gte=now)
|
||||
)
|
||||
|
||||
def is_owned_by(self, user):
|
||||
return user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
@ -209,21 +244,40 @@ class Screen(models.Model):
|
||||
|
||||
|
||||
class Poster(models.Model):
|
||||
name = models.CharField(_("name"), blank=False, null=False, max_length=128, default="")
|
||||
name = models.CharField(
|
||||
_("name"), blank=False, null=False, max_length=128, default=""
|
||||
)
|
||||
file = models.ImageField(_("file"), null=False, upload_to="com/posters")
|
||||
club = models.ForeignKey(Club, related_name="posters", verbose_name=_("club"), null=False)
|
||||
club = models.ForeignKey(
|
||||
Club, related_name="posters", verbose_name=_("club"), null=False
|
||||
)
|
||||
screens = models.ManyToManyField(Screen, related_name="posters")
|
||||
date_begin = models.DateTimeField(blank=False, null=False, default=timezone.now)
|
||||
date_end = models.DateTimeField(blank=True, null=True)
|
||||
display_time = models.IntegerField(_("display time"), blank=False, null=False, default=15)
|
||||
display_time = models.IntegerField(
|
||||
_("display time"), blank=False, null=False, default=15
|
||||
)
|
||||
is_moderated = models.BooleanField(_("is moderated"), default=False)
|
||||
moderator = models.ForeignKey(User, related_name="moderated_posters", verbose_name=_("moderator"), null=True, blank=True)
|
||||
moderator = models.ForeignKey(
|
||||
User,
|
||||
related_name="moderated_posters",
|
||||
verbose_name=_("moderator"),
|
||||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.is_moderated:
|
||||
for u in RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID).first().users.all():
|
||||
Notification(user=u, url=reverse("com:poster_moderate_list"),
|
||||
type="POSTER_MODERATION").save()
|
||||
for u in (
|
||||
RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
.first()
|
||||
.users.all()
|
||||
):
|
||||
Notification(
|
||||
user=u,
|
||||
url=reverse("com:poster_moderate_list"),
|
||||
type="POSTER_MODERATION",
|
||||
).save()
|
||||
return super(Poster, self).save(*args, **kwargs)
|
||||
|
||||
def clean(self, *args, **kwargs):
|
||||
@ -231,7 +285,9 @@ class Poster(models.Model):
|
||||
raise ValidationError(_("Begin date should be before end date"))
|
||||
|
||||
def is_owned_by(self, user):
|
||||
return user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID) or Club.objects.filter(id__in=user.clubs_with_rights)
|
||||
return user.is_in_group(
|
||||
settings.SITH_GROUP_COM_ADMIN_ID
|
||||
) or Club.objects.filter(id__in=user.clubs_with_rights)
|
||||
|
||||
def can_be_moderated_by(self, user):
|
||||
return user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
|
34
com/tests.py
34
com/tests.py
@ -34,25 +34,43 @@ class ComTest(TestCase):
|
||||
def setUp(self):
|
||||
call_command("populate")
|
||||
self.skia = User.objects.filter(username="skia").first()
|
||||
self.com_group = RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID).first()
|
||||
self.com_group = RealGroup.objects.filter(
|
||||
id=settings.SITH_GROUP_COM_ADMIN_ID
|
||||
).first()
|
||||
self.skia.groups = [self.com_group]
|
||||
self.skia.save()
|
||||
self.client.login(username=self.skia.username, password='plop')
|
||||
self.client.login(username=self.skia.username, password="plop")
|
||||
|
||||
def test_alert_msg(self):
|
||||
response = self.client.post(reverse("com:alert_edit"), {"alert_msg": """
|
||||
response = self.client.post(
|
||||
reverse("com:alert_edit"),
|
||||
{
|
||||
"alert_msg": """
|
||||
### ALERTE!
|
||||
|
||||
**Caaaataaaapuuuulte!!!!**
|
||||
"""})
|
||||
"""
|
||||
},
|
||||
)
|
||||
r = self.client.get(reverse("core:index"))
|
||||
self.assertTrue(r.status_code == 200)
|
||||
self.assertTrue("""<div id="alert_box">\\n <div class="markdown"><h3>ALERTE!</h3>\\n<p><strong>Caaaataaaapuuuulte!!!!</strong></p>""" in str(r.content))
|
||||
self.assertTrue(
|
||||
"""<div id="alert_box">\\n <div class="markdown"><h3>ALERTE!</h3>\\n<p><strong>Caaaataaaapuuuulte!!!!</strong></p>"""
|
||||
in str(r.content)
|
||||
)
|
||||
|
||||
def test_info_msg(self):
|
||||
response = self.client.post(reverse("com:info_edit"), {"info_msg": """
|
||||
response = self.client.post(
|
||||
reverse("com:info_edit"),
|
||||
{
|
||||
"info_msg": """
|
||||
### INFO: **Caaaataaaapuuuulte!!!!**
|
||||
"""})
|
||||
"""
|
||||
},
|
||||
)
|
||||
r = self.client.get(reverse("core:index"))
|
||||
self.assertTrue(r.status_code == 200)
|
||||
self.assertTrue("""<div id="info_box">\\n <div class="markdown"><h3>INFO: <strong>Caaaataaaapuuuulte!!!!</strong></h3>""" in str(r.content))
|
||||
self.assertTrue(
|
||||
"""<div id="info_box">\\n <div class="markdown"><h3>INFO: <strong>Caaaataaaapuuuulte!!!!</strong></h3>"""
|
||||
in str(r.content)
|
||||
)
|
||||
|
121
com/urls.py
121
com/urls.py
@ -28,35 +28,94 @@ from com.views import *
|
||||
from club.views import MailingDeleteView
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^sith/edit/alert$', AlertMsgEditView.as_view(), name='alert_edit'),
|
||||
url(r'^sith/edit/info$', InfoMsgEditView.as_view(), name='info_edit'),
|
||||
url(r'^sith/edit/index$', IndexEditView.as_view(), name='index_edit'),
|
||||
url(r'^sith/edit/weekmail_destinations$', WeekmailDestinationEditView.as_view(), name='weekmail_destinations'),
|
||||
url(r'^weekmail$', WeekmailEditView.as_view(), name='weekmail'),
|
||||
url(r'^weekmail/preview$', WeekmailPreviewView.as_view(), name='weekmail_preview'),
|
||||
url(r'^weekmail/new_article$', WeekmailArticleCreateView.as_view(), name='weekmail_article'),
|
||||
url(r'^weekmail/article/(?P<article_id>[0-9]+)/delete$', WeekmailArticleDeleteView.as_view(), name='weekmail_article_delete'),
|
||||
url(r'^weekmail/article/(?P<article_id>[0-9]+)/edit$', WeekmailArticleEditView.as_view(), name='weekmail_article_edit'),
|
||||
url(r'^news$', NewsListView.as_view(), name='news_list'),
|
||||
url(r'^news/admin$', NewsAdminListView.as_view(), name='news_admin_list'),
|
||||
url(r'^news/create$', NewsCreateView.as_view(), name='news_new'),
|
||||
url(r'^news/(?P<news_id>[0-9]+)/delete$', NewsDeleteView.as_view(), name='news_delete'),
|
||||
url(r'^news/(?P<news_id>[0-9]+)/moderate$', NewsModerateView.as_view(), name='news_moderate'),
|
||||
url(r'^news/(?P<news_id>[0-9]+)/edit$', NewsEditView.as_view(), name='news_edit'),
|
||||
url(r'^news/(?P<news_id>[0-9]+)$', NewsDetailView.as_view(), name='news_detail'),
|
||||
url(r'^mailings$', MailingListAdminView.as_view(), name='mailing_admin'),
|
||||
url(r'^mailings/(?P<mailing_id>[0-9]+)/moderate$', MailingModerateView.as_view(), name='mailing_moderate'),
|
||||
url(r'^mailings/(?P<mailing_id>[0-9]+)/delete$', MailingDeleteView.as_view(redirect_page='com:mailing_admin'), name='mailing_delete'),
|
||||
url(r'^poster$', PosterListView.as_view(), name='poster_list'),
|
||||
url(r'^poster/create$', PosterCreateView.as_view(), name='poster_create'),
|
||||
url(r'^poster/(?P<poster_id>[0-9]+)/edit$', PosterEditView.as_view(), name='poster_edit'),
|
||||
url(r'^poster/(?P<poster_id>[0-9]+)/delete$', PosterDeleteView.as_view(), name='poster_delete'),
|
||||
url(r'^poster/moderate$', PosterModerateListView.as_view(), name='poster_moderate_list'),
|
||||
url(r'^poster/(?P<object_id>[0-9]+)/moderate$', PosterModerateView.as_view(), name='poster_moderate'),
|
||||
url(r'^screen$', ScreenListView.as_view(), name='screen_list'),
|
||||
url(r'^screen/create$', ScreenCreateView.as_view(), name='screen_create'),
|
||||
url(r'^screen/(?P<screen_id>[0-9]+)/slideshow$', ScreenSlideshowView.as_view(), name='screen_slideshow'),
|
||||
url(r'^screen/(?P<screen_id>[0-9]+)/edit$', ScreenEditView.as_view(), name='screen_edit'),
|
||||
url(r'^screen/(?P<screen_id>[0-9]+)/delete$', ScreenDeleteView.as_view(), name='screen_delete'),
|
||||
url(r"^sith/edit/alert$", AlertMsgEditView.as_view(), name="alert_edit"),
|
||||
url(r"^sith/edit/info$", InfoMsgEditView.as_view(), name="info_edit"),
|
||||
url(r"^sith/edit/index$", IndexEditView.as_view(), name="index_edit"),
|
||||
url(
|
||||
r"^sith/edit/weekmail_destinations$",
|
||||
WeekmailDestinationEditView.as_view(),
|
||||
name="weekmail_destinations",
|
||||
),
|
||||
url(r"^weekmail$", WeekmailEditView.as_view(), name="weekmail"),
|
||||
url(r"^weekmail/preview$", WeekmailPreviewView.as_view(), name="weekmail_preview"),
|
||||
url(
|
||||
r"^weekmail/new_article$",
|
||||
WeekmailArticleCreateView.as_view(),
|
||||
name="weekmail_article",
|
||||
),
|
||||
url(
|
||||
r"^weekmail/article/(?P<article_id>[0-9]+)/delete$",
|
||||
WeekmailArticleDeleteView.as_view(),
|
||||
name="weekmail_article_delete",
|
||||
),
|
||||
url(
|
||||
r"^weekmail/article/(?P<article_id>[0-9]+)/edit$",
|
||||
WeekmailArticleEditView.as_view(),
|
||||
name="weekmail_article_edit",
|
||||
),
|
||||
url(r"^news$", NewsListView.as_view(), name="news_list"),
|
||||
url(r"^news/admin$", NewsAdminListView.as_view(), name="news_admin_list"),
|
||||
url(r"^news/create$", NewsCreateView.as_view(), name="news_new"),
|
||||
url(
|
||||
r"^news/(?P<news_id>[0-9]+)/delete$",
|
||||
NewsDeleteView.as_view(),
|
||||
name="news_delete",
|
||||
),
|
||||
url(
|
||||
r"^news/(?P<news_id>[0-9]+)/moderate$",
|
||||
NewsModerateView.as_view(),
|
||||
name="news_moderate",
|
||||
),
|
||||
url(r"^news/(?P<news_id>[0-9]+)/edit$", NewsEditView.as_view(), name="news_edit"),
|
||||
url(r"^news/(?P<news_id>[0-9]+)$", NewsDetailView.as_view(), name="news_detail"),
|
||||
url(r"^mailings$", MailingListAdminView.as_view(), name="mailing_admin"),
|
||||
url(
|
||||
r"^mailings/(?P<mailing_id>[0-9]+)/moderate$",
|
||||
MailingModerateView.as_view(),
|
||||
name="mailing_moderate",
|
||||
),
|
||||
url(
|
||||
r"^mailings/(?P<mailing_id>[0-9]+)/delete$",
|
||||
MailingDeleteView.as_view(redirect_page="com:mailing_admin"),
|
||||
name="mailing_delete",
|
||||
),
|
||||
url(r"^poster$", PosterListView.as_view(), name="poster_list"),
|
||||
url(r"^poster/create$", PosterCreateView.as_view(), name="poster_create"),
|
||||
url(
|
||||
r"^poster/(?P<poster_id>[0-9]+)/edit$",
|
||||
PosterEditView.as_view(),
|
||||
name="poster_edit",
|
||||
),
|
||||
url(
|
||||
r"^poster/(?P<poster_id>[0-9]+)/delete$",
|
||||
PosterDeleteView.as_view(),
|
||||
name="poster_delete",
|
||||
),
|
||||
url(
|
||||
r"^poster/moderate$",
|
||||
PosterModerateListView.as_view(),
|
||||
name="poster_moderate_list",
|
||||
),
|
||||
url(
|
||||
r"^poster/(?P<object_id>[0-9]+)/moderate$",
|
||||
PosterModerateView.as_view(),
|
||||
name="poster_moderate",
|
||||
),
|
||||
url(r"^screen$", ScreenListView.as_view(), name="screen_list"),
|
||||
url(r"^screen/create$", ScreenCreateView.as_view(), name="screen_create"),
|
||||
url(
|
||||
r"^screen/(?P<screen_id>[0-9]+)/slideshow$",
|
||||
ScreenSlideshowView.as_view(),
|
||||
name="screen_slideshow",
|
||||
),
|
||||
url(
|
||||
r"^screen/(?P<screen_id>[0-9]+)/edit$",
|
||||
ScreenEditView.as_view(),
|
||||
name="screen_edit",
|
||||
),
|
||||
url(
|
||||
r"^screen/(?P<screen_id>[0-9]+)/delete$",
|
||||
ScreenDeleteView.as_view(),
|
||||
name="screen_delete",
|
||||
),
|
||||
]
|
||||
|
||||
|
559
com/views.py
559
com/views.py
@ -41,7 +41,14 @@ from django import forms
|
||||
from datetime import timedelta
|
||||
|
||||
from com.models import Sith, News, NewsDate, Weekmail, WeekmailArticle, Screen, Poster
|
||||
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, TabedViewMixin, CanCreateMixin, QuickNotifMixin
|
||||
from core.views import (
|
||||
CanViewMixin,
|
||||
CanEditMixin,
|
||||
CanEditPropMixin,
|
||||
TabedViewMixin,
|
||||
CanCreateMixin,
|
||||
QuickNotifMixin,
|
||||
)
|
||||
from core.views.forms import SelectDateTime
|
||||
from core.models import Notification, RealGroup, User
|
||||
from club.models import Club, Mailing
|
||||
@ -55,23 +62,40 @@ sith = Sith.objects.first
|
||||
class PosterForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Poster
|
||||
fields = ['name', 'file', 'club', 'screens', 'date_begin', 'date_end', 'display_time']
|
||||
widgets = {
|
||||
'screens': forms.CheckboxSelectMultiple,
|
||||
}
|
||||
fields = [
|
||||
"name",
|
||||
"file",
|
||||
"club",
|
||||
"screens",
|
||||
"date_begin",
|
||||
"date_end",
|
||||
"display_time",
|
||||
]
|
||||
widgets = {"screens": forms.CheckboxSelectMultiple}
|
||||
|
||||
date_begin = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("Start date"),
|
||||
widget=SelectDateTime, required=True, initial=timezone.now().strftime("%Y-%m-%d %H:%M:%S"))
|
||||
date_end = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("End date"),
|
||||
widget=SelectDateTime, required=False)
|
||||
date_begin = forms.DateTimeField(
|
||||
["%Y-%m-%d %H:%M:%S"],
|
||||
label=_("Start date"),
|
||||
widget=SelectDateTime,
|
||||
required=True,
|
||||
initial=timezone.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
)
|
||||
date_end = forms.DateTimeField(
|
||||
["%Y-%m-%d %H:%M:%S"],
|
||||
label=_("End date"),
|
||||
widget=SelectDateTime,
|
||||
required=False,
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.user = kwargs.pop('user', None)
|
||||
self.user = kwargs.pop("user", None)
|
||||
super(PosterForm, self).__init__(*args, **kwargs)
|
||||
if self.user:
|
||||
if not self.user.is_com_admin:
|
||||
self.fields['club'].queryset = Club.objects.filter(id__in=self.user.clubs_with_rights)
|
||||
self.fields.pop('display_time')
|
||||
self.fields["club"].queryset = Club.objects.filter(
|
||||
id__in=self.user.clubs_with_rights
|
||||
)
|
||||
self.fields.pop("display_time")
|
||||
|
||||
|
||||
class ComTabsMixin(TabedViewMixin):
|
||||
@ -80,51 +104,54 @@ class ComTabsMixin(TabedViewMixin):
|
||||
|
||||
def get_list_of_tabs(self):
|
||||
tab_list = []
|
||||
tab_list.append({
|
||||
'url': reverse('com:weekmail'),
|
||||
'slug': 'weekmail',
|
||||
'name': _("Weekmail"),
|
||||
})
|
||||
tab_list.append({
|
||||
'url': reverse('com:weekmail_destinations'),
|
||||
'slug': 'weekmail_destinations',
|
||||
'name': _("Weekmail destinations"),
|
||||
})
|
||||
tab_list.append({
|
||||
'url': reverse('com:index_edit'),
|
||||
'slug': 'index',
|
||||
'name': _("Index page"),
|
||||
})
|
||||
tab_list.append({
|
||||
'url': reverse('com:info_edit'),
|
||||
'slug': 'info',
|
||||
'name': _("Info message"),
|
||||
})
|
||||
tab_list.append({
|
||||
'url': reverse('com:alert_edit'),
|
||||
'slug': 'alert',
|
||||
'name': _("Alert message"),
|
||||
})
|
||||
tab_list.append({
|
||||
'url': reverse('com:mailing_admin'),
|
||||
'slug': 'mailings',
|
||||
'name': _("Mailing lists administration"),
|
||||
})
|
||||
tab_list.append({
|
||||
'url': reverse('com:poster_list'),
|
||||
'slug': 'posters',
|
||||
'name': _("Posters list"),
|
||||
})
|
||||
tab_list.append({
|
||||
'url': reverse('com:screen_list'),
|
||||
'slug': 'screens',
|
||||
'name': _("Screens list"),
|
||||
})
|
||||
tab_list.append(
|
||||
{"url": reverse("com:weekmail"), "slug": "weekmail", "name": _("Weekmail")}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse("com:weekmail_destinations"),
|
||||
"slug": "weekmail_destinations",
|
||||
"name": _("Weekmail destinations"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{"url": reverse("com:index_edit"), "slug": "index", "name": _("Index page")}
|
||||
)
|
||||
tab_list.append(
|
||||
{"url": reverse("com:info_edit"), "slug": "info", "name": _("Info message")}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse("com:alert_edit"),
|
||||
"slug": "alert",
|
||||
"name": _("Alert message"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse("com:mailing_admin"),
|
||||
"slug": "mailings",
|
||||
"name": _("Mailing lists administration"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse("com:poster_list"),
|
||||
"slug": "posters",
|
||||
"name": _("Posters list"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse("com:screen_list"),
|
||||
"slug": "screens",
|
||||
"name": _("Screens list"),
|
||||
}
|
||||
)
|
||||
return tab_list
|
||||
|
||||
|
||||
class IsComAdminMixin(View):
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if not (request.user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID)):
|
||||
raise PermissionDenied
|
||||
@ -133,34 +160,35 @@ class IsComAdminMixin(View):
|
||||
|
||||
class ComEditView(ComTabsMixin, CanEditPropMixin, UpdateView):
|
||||
model = Sith
|
||||
template_name = 'core/edit.jinja'
|
||||
template_name = "core/edit.jinja"
|
||||
|
||||
def get_object(self, queryset=None):
|
||||
return Sith.objects.first()
|
||||
|
||||
|
||||
class AlertMsgEditView(ComEditView):
|
||||
fields = ['alert_msg']
|
||||
fields = ["alert_msg"]
|
||||
current_tab = "alert"
|
||||
success_url = reverse_lazy('com:alert_edit')
|
||||
success_url = reverse_lazy("com:alert_edit")
|
||||
|
||||
|
||||
class InfoMsgEditView(ComEditView):
|
||||
fields = ['info_msg']
|
||||
fields = ["info_msg"]
|
||||
current_tab = "info"
|
||||
success_url = reverse_lazy('com:info_edit')
|
||||
success_url = reverse_lazy("com:info_edit")
|
||||
|
||||
|
||||
class IndexEditView(ComEditView):
|
||||
fields = ['index_page']
|
||||
fields = ["index_page"]
|
||||
current_tab = "index"
|
||||
success_url = reverse_lazy('com:index_edit')
|
||||
success_url = reverse_lazy("com:index_edit")
|
||||
|
||||
|
||||
class WeekmailDestinationEditView(ComEditView):
|
||||
fields = ['weekmail_destinations']
|
||||
fields = ["weekmail_destinations"]
|
||||
current_tab = "weekmail_destinations"
|
||||
success_url = reverse_lazy('com:weekmail_destinations')
|
||||
success_url = reverse_lazy("com:weekmail_destinations")
|
||||
|
||||
|
||||
# News
|
||||
|
||||
@ -168,43 +196,64 @@ class WeekmailDestinationEditView(ComEditView):
|
||||
class NewsForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = News
|
||||
fields = ['type', 'title', 'club', 'summary', 'content', 'author']
|
||||
widgets = {
|
||||
'author': forms.HiddenInput,
|
||||
'type': forms.RadioSelect,
|
||||
}
|
||||
start_date = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("Start date"), widget=SelectDateTime, required=False)
|
||||
end_date = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("End date"), widget=SelectDateTime, required=False)
|
||||
until = forms.DateTimeField(['%Y-%m-%d %H:%M:%S'], label=_("Until"), widget=SelectDateTime, required=False)
|
||||
fields = ["type", "title", "club", "summary", "content", "author"]
|
||||
widgets = {"author": forms.HiddenInput, "type": forms.RadioSelect}
|
||||
|
||||
start_date = forms.DateTimeField(
|
||||
["%Y-%m-%d %H:%M:%S"],
|
||||
label=_("Start date"),
|
||||
widget=SelectDateTime,
|
||||
required=False,
|
||||
)
|
||||
end_date = forms.DateTimeField(
|
||||
["%Y-%m-%d %H:%M:%S"],
|
||||
label=_("End date"),
|
||||
widget=SelectDateTime,
|
||||
required=False,
|
||||
)
|
||||
until = forms.DateTimeField(
|
||||
["%Y-%m-%d %H:%M:%S"], label=_("Until"), widget=SelectDateTime, required=False
|
||||
)
|
||||
automoderation = forms.BooleanField(label=_("Automoderation"), required=False)
|
||||
|
||||
def clean(self):
|
||||
self.cleaned_data = super(NewsForm, self).clean()
|
||||
if self.cleaned_data['type'] != "NOTICE":
|
||||
if not self.cleaned_data['start_date']:
|
||||
self.add_error('start_date', ValidationError(_("This field is required.")))
|
||||
if not self.cleaned_data['end_date']:
|
||||
self.add_error('end_date', ValidationError(_("This field is required.")))
|
||||
if self.cleaned_data['start_date'] > self.cleaned_data['end_date']:
|
||||
self.add_error('end_date', ValidationError(_("You crazy? You can not finish an event before starting it.")))
|
||||
if self.cleaned_data['type'] == "WEEKLY" and not self.cleaned_data['until']:
|
||||
self.add_error('until', ValidationError(_("This field is required.")))
|
||||
if self.cleaned_data["type"] != "NOTICE":
|
||||
if not self.cleaned_data["start_date"]:
|
||||
self.add_error(
|
||||
"start_date", ValidationError(_("This field is required."))
|
||||
)
|
||||
if not self.cleaned_data["end_date"]:
|
||||
self.add_error(
|
||||
"end_date", ValidationError(_("This field is required."))
|
||||
)
|
||||
if self.cleaned_data["start_date"] > self.cleaned_data["end_date"]:
|
||||
self.add_error(
|
||||
"end_date",
|
||||
ValidationError(
|
||||
_("You crazy? You can not finish an event before starting it.")
|
||||
),
|
||||
)
|
||||
if self.cleaned_data["type"] == "WEEKLY" and not self.cleaned_data["until"]:
|
||||
self.add_error("until", ValidationError(_("This field is required.")))
|
||||
return self.cleaned_data
|
||||
|
||||
def save(self):
|
||||
ret = super(NewsForm, self).save()
|
||||
self.instance.dates.all().delete()
|
||||
if self.instance.type == "EVENT" or self.instance.type == "CALL":
|
||||
NewsDate(start_date=self.cleaned_data['start_date'],
|
||||
end_date=self.cleaned_data['end_date'],
|
||||
news=self.instance).save()
|
||||
NewsDate(
|
||||
start_date=self.cleaned_data["start_date"],
|
||||
end_date=self.cleaned_data["end_date"],
|
||||
news=self.instance,
|
||||
).save()
|
||||
elif self.instance.type == "WEEKLY":
|
||||
start_date = self.cleaned_data['start_date']
|
||||
end_date = self.cleaned_data['end_date']
|
||||
while start_date <= self.cleaned_data['until']:
|
||||
NewsDate(start_date=start_date,
|
||||
end_date=end_date,
|
||||
news=self.instance).save()
|
||||
start_date = self.cleaned_data["start_date"]
|
||||
end_date = self.cleaned_data["end_date"]
|
||||
while start_date <= self.cleaned_data["until"]:
|
||||
NewsDate(
|
||||
start_date=start_date, end_date=end_date, news=self.instance
|
||||
).save()
|
||||
start_date += timedelta(days=7)
|
||||
end_date += timedelta(days=7)
|
||||
return ret
|
||||
@ -213,59 +262,81 @@ class NewsForm(forms.ModelForm):
|
||||
class NewsEditView(CanEditMixin, UpdateView):
|
||||
model = News
|
||||
form_class = NewsForm
|
||||
template_name = 'com/news_edit.jinja'
|
||||
pk_url_kwarg = 'news_id'
|
||||
template_name = "com/news_edit.jinja"
|
||||
pk_url_kwarg = "news_id"
|
||||
|
||||
def get_initial(self):
|
||||
init = {}
|
||||
try:
|
||||
init['start_date'] = self.object.dates.order_by('id').first().start_date.strftime('%Y-%m-%d %H:%M:%S')
|
||||
init["start_date"] = (
|
||||
self.object.dates.order_by("id")
|
||||
.first()
|
||||
.start_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
)
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
init['end_date'] = self.object.dates.order_by('id').first().end_date.strftime('%Y-%m-%d %H:%M:%S')
|
||||
init["end_date"] = (
|
||||
self.object.dates.order_by("id")
|
||||
.first()
|
||||
.end_date.strftime("%Y-%m-%d %H:%M:%S")
|
||||
)
|
||||
except:
|
||||
pass
|
||||
return init
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
form = self.get_form()
|
||||
if form.is_valid() and 'preview' not in request.POST.keys():
|
||||
if form.is_valid() and "preview" not in request.POST.keys():
|
||||
return self.form_valid(form)
|
||||
else:
|
||||
return self.form_invalid(form)
|
||||
|
||||
def form_valid(self, form):
|
||||
self.object = form.save()
|
||||
if form.cleaned_data['automoderation'] and self.request.user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID):
|
||||
if form.cleaned_data["automoderation"] and self.request.user.is_in_group(
|
||||
settings.SITH_GROUP_COM_ADMIN_ID
|
||||
):
|
||||
self.object.moderator = self.request.user
|
||||
self.object.is_moderated = True
|
||||
self.object.save()
|
||||
else:
|
||||
self.object.is_moderated = False
|
||||
self.object.save()
|
||||
for u in RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID).first().users.all():
|
||||
if not u.notifications.filter(type="NEWS_MODERATION", viewed=False).exists():
|
||||
Notification(user=u, url=reverse("com:news_detail", kwargs={'news_id': self.object.id}), type="NEWS_MODERATION").save()
|
||||
for u in (
|
||||
RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
.first()
|
||||
.users.all()
|
||||
):
|
||||
if not u.notifications.filter(
|
||||
type="NEWS_MODERATION", viewed=False
|
||||
).exists():
|
||||
Notification(
|
||||
user=u,
|
||||
url=reverse(
|
||||
"com:news_detail", kwargs={"news_id": self.object.id}
|
||||
),
|
||||
type="NEWS_MODERATION",
|
||||
).save()
|
||||
return super(NewsEditView, self).form_valid(form)
|
||||
|
||||
|
||||
class NewsCreateView(CanCreateMixin, CreateView):
|
||||
model = News
|
||||
form_class = NewsForm
|
||||
template_name = 'com/news_edit.jinja'
|
||||
template_name = "com/news_edit.jinja"
|
||||
|
||||
def get_initial(self):
|
||||
init = {'author': self.request.user}
|
||||
init = {"author": self.request.user}
|
||||
try:
|
||||
init['club'] = Club.objects.filter(id=self.request.GET['club']).first()
|
||||
init["club"] = Club.objects.filter(id=self.request.GET["club"]).first()
|
||||
except:
|
||||
pass
|
||||
return init
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
form = self.get_form()
|
||||
if form.is_valid() and 'preview' not in request.POST.keys():
|
||||
if form.is_valid() and "preview" not in request.POST.keys():
|
||||
return self.form_valid(form)
|
||||
else:
|
||||
self.object = form.instance
|
||||
@ -273,176 +344,216 @@ class NewsCreateView(CanCreateMixin, CreateView):
|
||||
|
||||
def form_valid(self, form):
|
||||
self.object = form.save()
|
||||
if form.cleaned_data['automoderation'] and self.request.user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID):
|
||||
if form.cleaned_data["automoderation"] and self.request.user.is_in_group(
|
||||
settings.SITH_GROUP_COM_ADMIN_ID
|
||||
):
|
||||
self.object.moderator = self.request.user
|
||||
self.object.is_moderated = True
|
||||
self.object.save()
|
||||
else:
|
||||
for u in RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID).first().users.all():
|
||||
if not u.notifications.filter(type="NEWS_MODERATION", viewed=False).exists():
|
||||
Notification(user=u, url=reverse("com:news_admin_list"), type="NEWS_MODERATION").save()
|
||||
for u in (
|
||||
RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
.first()
|
||||
.users.all()
|
||||
):
|
||||
if not u.notifications.filter(
|
||||
type="NEWS_MODERATION", viewed=False
|
||||
).exists():
|
||||
Notification(
|
||||
user=u,
|
||||
url=reverse("com:news_admin_list"),
|
||||
type="NEWS_MODERATION",
|
||||
).save()
|
||||
return super(NewsCreateView, self).form_valid(form)
|
||||
|
||||
|
||||
class NewsDeleteView(CanEditMixin, DeleteView):
|
||||
model = News
|
||||
pk_url_kwarg = 'news_id'
|
||||
template_name = 'core/delete_confirm.jinja'
|
||||
success_url = reverse_lazy('com:news_admin_list')
|
||||
pk_url_kwarg = "news_id"
|
||||
template_name = "core/delete_confirm.jinja"
|
||||
success_url = reverse_lazy("com:news_admin_list")
|
||||
|
||||
|
||||
class NewsModerateView(CanEditMixin, SingleObjectMixin):
|
||||
model = News
|
||||
pk_url_kwarg = 'news_id'
|
||||
pk_url_kwarg = "news_id"
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
if 'remove' in request.GET.keys():
|
||||
if "remove" in request.GET.keys():
|
||||
self.object.is_moderated = False
|
||||
else:
|
||||
self.object.is_moderated = True
|
||||
self.object.moderator = request.user
|
||||
self.object.save()
|
||||
if 'next' in self.request.GET.keys():
|
||||
return redirect(self.request.GET['next'])
|
||||
return redirect('com:news_admin_list')
|
||||
if "next" in self.request.GET.keys():
|
||||
return redirect(self.request.GET["next"])
|
||||
return redirect("com:news_admin_list")
|
||||
|
||||
|
||||
class NewsAdminListView(CanEditMixin, ListView):
|
||||
model = News
|
||||
template_name = 'com/news_admin_list.jinja'
|
||||
template_name = "com/news_admin_list.jinja"
|
||||
queryset = News.objects.all()
|
||||
|
||||
|
||||
class NewsListView(CanViewMixin, ListView):
|
||||
model = News
|
||||
template_name = 'com/news_list.jinja'
|
||||
template_name = "com/news_list.jinja"
|
||||
queryset = News.objects.filter(is_moderated=True)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(NewsListView, self).get_context_data(**kwargs)
|
||||
kwargs['NewsDate'] = NewsDate
|
||||
kwargs['timedelta'] = timedelta
|
||||
kwargs['birthdays'] = User.objects\
|
||||
.filter(date_of_birth__month=timezone.now().month, date_of_birth__day=timezone.now().day)\
|
||||
.filter(role__in=['STUDENT', 'FORMER STUDENT'])\
|
||||
.order_by('-date_of_birth')
|
||||
kwargs["NewsDate"] = NewsDate
|
||||
kwargs["timedelta"] = timedelta
|
||||
kwargs["birthdays"] = (
|
||||
User.objects.filter(
|
||||
date_of_birth__month=timezone.now().month,
|
||||
date_of_birth__day=timezone.now().day,
|
||||
)
|
||||
.filter(role__in=["STUDENT", "FORMER STUDENT"])
|
||||
.order_by("-date_of_birth")
|
||||
)
|
||||
return kwargs
|
||||
|
||||
|
||||
class NewsDetailView(CanViewMixin, DetailView):
|
||||
model = News
|
||||
template_name = 'com/news_detail.jinja'
|
||||
pk_url_kwarg = 'news_id'
|
||||
template_name = "com/news_detail.jinja"
|
||||
pk_url_kwarg = "news_id"
|
||||
|
||||
|
||||
# Weekmail
|
||||
|
||||
|
||||
class WeekmailPreviewView(ComTabsMixin, CanEditPropMixin, DetailView):
|
||||
model = Weekmail
|
||||
template_name = 'com/weekmail_preview.jinja'
|
||||
success_url = reverse_lazy('com:weekmail')
|
||||
template_name = "com/weekmail_preview.jinja"
|
||||
success_url = reverse_lazy("com:weekmail")
|
||||
current_tab = "weekmail"
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
try:
|
||||
if request.POST['send'] == "validate":
|
||||
if request.POST["send"] == "validate":
|
||||
self.object.send()
|
||||
return HttpResponseRedirect(reverse('com:weekmail') + "?qn_weekmail_send_success")
|
||||
return HttpResponseRedirect(
|
||||
reverse("com:weekmail") + "?qn_weekmail_send_success"
|
||||
)
|
||||
except:
|
||||
pass
|
||||
return super(WeekmailEditView, self).get(request, *args, **kwargs)
|
||||
|
||||
def get_object(self, queryset=None):
|
||||
return self.model.objects.filter(sent=False).order_by('-id').first()
|
||||
return self.model.objects.filter(sent=False).order_by("-id").first()
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
"""Add rendered weekmail"""
|
||||
kwargs = super(WeekmailPreviewView, self).get_context_data(**kwargs)
|
||||
kwargs['weekmail_rendered'] = self.object.render_html()
|
||||
kwargs["weekmail_rendered"] = self.object.render_html()
|
||||
return kwargs
|
||||
|
||||
|
||||
class WeekmailEditView(ComTabsMixin, QuickNotifMixin, CanEditPropMixin, UpdateView):
|
||||
model = Weekmail
|
||||
template_name = 'com/weekmail.jinja'
|
||||
form_class = modelform_factory(Weekmail, fields=['title', 'intro', 'joke', 'protip', 'conclusion'],
|
||||
help_texts={'title': _("Delete and save to regenerate")})
|
||||
success_url = reverse_lazy('com:weekmail')
|
||||
template_name = "com/weekmail.jinja"
|
||||
form_class = modelform_factory(
|
||||
Weekmail,
|
||||
fields=["title", "intro", "joke", "protip", "conclusion"],
|
||||
help_texts={"title": _("Delete and save to regenerate")},
|
||||
)
|
||||
success_url = reverse_lazy("com:weekmail")
|
||||
current_tab = "weekmail"
|
||||
|
||||
def get_object(self, queryset=None):
|
||||
weekmail = self.model.objects.filter(sent=False).order_by('-id').first()
|
||||
weekmail = self.model.objects.filter(sent=False).order_by("-id").first()
|
||||
if not weekmail.title:
|
||||
now = timezone.now()
|
||||
weekmail.title = _("Weekmail of the ") + (now + timedelta(days=6 - now.weekday())).strftime('%d/%m/%Y')
|
||||
weekmail.title = _("Weekmail of the ") + (
|
||||
now + timedelta(days=6 - now.weekday())
|
||||
).strftime("%d/%m/%Y")
|
||||
weekmail.save()
|
||||
return weekmail
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
if 'up_article' in request.GET.keys():
|
||||
art = get_object_or_404(WeekmailArticle, id=request.GET['up_article'], weekmail=self.object)
|
||||
prev_art = self.object.articles.order_by('rank').filter(rank__lt=art.rank).last()
|
||||
if "up_article" in request.GET.keys():
|
||||
art = get_object_or_404(
|
||||
WeekmailArticle, id=request.GET["up_article"], weekmail=self.object
|
||||
)
|
||||
prev_art = (
|
||||
self.object.articles.order_by("rank").filter(rank__lt=art.rank).last()
|
||||
)
|
||||
if prev_art:
|
||||
art.rank, prev_art.rank = prev_art.rank, art.rank
|
||||
art.save()
|
||||
prev_art.save()
|
||||
self.quick_notif_list += ['qn_success']
|
||||
if 'down_article' in request.GET.keys():
|
||||
art = get_object_or_404(WeekmailArticle, id=request.GET['down_article'], weekmail=self.object)
|
||||
next_art = self.object.articles.order_by('rank').filter(rank__gt=art.rank).first()
|
||||
self.quick_notif_list += ["qn_success"]
|
||||
if "down_article" in request.GET.keys():
|
||||
art = get_object_or_404(
|
||||
WeekmailArticle, id=request.GET["down_article"], weekmail=self.object
|
||||
)
|
||||
next_art = (
|
||||
self.object.articles.order_by("rank").filter(rank__gt=art.rank).first()
|
||||
)
|
||||
if next_art:
|
||||
art.rank, next_art.rank = next_art.rank, art.rank
|
||||
art.save()
|
||||
next_art.save()
|
||||
self.quick_notif_list += ['qn_success']
|
||||
if 'add_article' in request.GET.keys():
|
||||
art = get_object_or_404(WeekmailArticle, id=request.GET['add_article'], weekmail=None)
|
||||
self.quick_notif_list += ["qn_success"]
|
||||
if "add_article" in request.GET.keys():
|
||||
art = get_object_or_404(
|
||||
WeekmailArticle, id=request.GET["add_article"], weekmail=None
|
||||
)
|
||||
art.weekmail = self.object
|
||||
art.rank = self.object.articles.aggregate(Max('rank'))['rank__max'] or 0
|
||||
art.rank = self.object.articles.aggregate(Max("rank"))["rank__max"] or 0
|
||||
art.rank += 1
|
||||
art.save()
|
||||
self.quick_notif_list += ['qn_success']
|
||||
if 'del_article' in request.GET.keys():
|
||||
art = get_object_or_404(WeekmailArticle, id=request.GET['del_article'], weekmail=self.object)
|
||||
self.quick_notif_list += ["qn_success"]
|
||||
if "del_article" in request.GET.keys():
|
||||
art = get_object_or_404(
|
||||
WeekmailArticle, id=request.GET["del_article"], weekmail=self.object
|
||||
)
|
||||
art.weekmail = None
|
||||
art.rank = -1
|
||||
art.save()
|
||||
self.quick_notif_list += ['qn_success']
|
||||
self.quick_notif_list += ["qn_success"]
|
||||
return super(WeekmailEditView, self).get(request, *args, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
"""Add orphan articles """
|
||||
kwargs = super(WeekmailEditView, self).get_context_data(**kwargs)
|
||||
kwargs['orphans'] = WeekmailArticle.objects.filter(weekmail=None)
|
||||
kwargs["orphans"] = WeekmailArticle.objects.filter(weekmail=None)
|
||||
return kwargs
|
||||
|
||||
|
||||
class WeekmailArticleEditView(ComTabsMixin, QuickNotifMixin, CanEditPropMixin, UpdateView):
|
||||
class WeekmailArticleEditView(
|
||||
ComTabsMixin, QuickNotifMixin, CanEditPropMixin, UpdateView
|
||||
):
|
||||
"""Edit an article"""
|
||||
|
||||
model = WeekmailArticle
|
||||
fields = ['title', 'club', 'content']
|
||||
fields = ["title", "club", "content"]
|
||||
pk_url_kwarg = "article_id"
|
||||
template_name = 'core/edit.jinja'
|
||||
success_url = reverse_lazy('com:weekmail')
|
||||
template_name = "core/edit.jinja"
|
||||
success_url = reverse_lazy("com:weekmail")
|
||||
quick_notif_url_arg = "qn_weekmail_article_edit"
|
||||
current_tab = "weekmail"
|
||||
|
||||
|
||||
class WeekmailArticleCreateView(QuickNotifMixin, CreateView):
|
||||
"""Post an article"""
|
||||
|
||||
model = WeekmailArticle
|
||||
fields = ['title', 'club', 'content']
|
||||
template_name = 'core/create.jinja'
|
||||
success_url = reverse_lazy('core:user_tools')
|
||||
fields = ["title", "club", "content"]
|
||||
template_name = "core/create.jinja"
|
||||
success_url = reverse_lazy("core:user_tools")
|
||||
quick_notif_url_arg = "qn_weekmail_new_article"
|
||||
|
||||
def get_initial(self):
|
||||
init = {}
|
||||
try:
|
||||
init['club'] = Club.objects.filter(id=self.request.GET['club']).first()
|
||||
init["club"] = Club.objects.filter(id=self.request.GET["club"]).first()
|
||||
except:
|
||||
pass
|
||||
return init
|
||||
@ -456,8 +567,15 @@ class WeekmailArticleCreateView(QuickNotifMixin, CreateView):
|
||||
if m.role <= settings.SITH_MAXIMUM_FREE_ROLE:
|
||||
raise
|
||||
except:
|
||||
form.add_error('club', ValidationError(_("You must be a board member of the selected club to post in the Weekmail.")))
|
||||
if form.is_valid() and not 'preview' in request.POST.keys():
|
||||
form.add_error(
|
||||
"club",
|
||||
ValidationError(
|
||||
_(
|
||||
"You must be a board member of the selected club to post in the Weekmail."
|
||||
)
|
||||
),
|
||||
)
|
||||
if form.is_valid() and not "preview" in request.POST.keys():
|
||||
return self.form_valid(form)
|
||||
else:
|
||||
return self.form_invalid(form)
|
||||
@ -469,9 +587,10 @@ class WeekmailArticleCreateView(QuickNotifMixin, CreateView):
|
||||
|
||||
class WeekmailArticleDeleteView(CanEditPropMixin, DeleteView):
|
||||
"""Delete an article"""
|
||||
|
||||
model = WeekmailArticle
|
||||
template_name = 'core/delete_confirm.jinja'
|
||||
success_url = reverse_lazy('com:weekmail')
|
||||
template_name = "core/delete_confirm.jinja"
|
||||
success_url = reverse_lazy("com:weekmail")
|
||||
pk_url_kwarg = "article_id"
|
||||
|
||||
|
||||
@ -481,40 +600,43 @@ class MailingListAdminView(ComTabsMixin, ListView):
|
||||
current_tab = "mailings"
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if not (request.user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID) or request.user.is_root):
|
||||
if not (
|
||||
request.user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID)
|
||||
or request.user.is_root
|
||||
):
|
||||
raise PermissionDenied
|
||||
return super(MailingListAdminView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(MailingListAdminView, self).get_context_data(**kwargs)
|
||||
kwargs['moderated'] = self.get_queryset().filter(is_moderated=True).all()
|
||||
kwargs['unmoderated'] = self.get_queryset().filter(is_moderated=False).all()
|
||||
kwargs['has_moderated'] = len(kwargs['moderated']) > 0
|
||||
kwargs['has_unmoderated'] = len(kwargs['unmoderated']) > 0
|
||||
kwargs["moderated"] = self.get_queryset().filter(is_moderated=True).all()
|
||||
kwargs["unmoderated"] = self.get_queryset().filter(is_moderated=False).all()
|
||||
kwargs["has_moderated"] = len(kwargs["moderated"]) > 0
|
||||
kwargs["has_unmoderated"] = len(kwargs["unmoderated"]) > 0
|
||||
return kwargs
|
||||
|
||||
|
||||
class MailingModerateView(View):
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
mailing = get_object_or_404(Mailing, pk=kwargs['mailing_id'])
|
||||
mailing = get_object_or_404(Mailing, pk=kwargs["mailing_id"])
|
||||
if mailing.can_moderate(request.user):
|
||||
mailing.is_moderated = True
|
||||
mailing.moderator = request.user
|
||||
mailing.save()
|
||||
return redirect('com:mailing_admin')
|
||||
return redirect("com:mailing_admin")
|
||||
|
||||
raise PermissionDenied
|
||||
|
||||
|
||||
class PosterListBaseView(ListView):
|
||||
"""List communication posters"""
|
||||
|
||||
current_tab = "posters"
|
||||
model = Poster
|
||||
template_name = 'com/poster_list.jinja'
|
||||
template_name = "com/poster_list.jinja"
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
club_id = kwargs.pop('club_id', None)
|
||||
club_id = kwargs.pop("club_id", None)
|
||||
self.club = None
|
||||
if club_id:
|
||||
self.club = get_object_or_404(Club, pk=club_id)
|
||||
@ -522,40 +644,41 @@ class PosterListBaseView(ListView):
|
||||
|
||||
def get_queryset(self):
|
||||
if self.request.user.is_com_admin:
|
||||
return Poster.objects.all().order_by('-date_begin')
|
||||
return Poster.objects.all().order_by("-date_begin")
|
||||
else:
|
||||
return Poster.objects.filter(club=self.club.id)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterListBaseView, self).get_context_data(**kwargs)
|
||||
if not self.request.user.is_com_admin:
|
||||
kwargs['club'] = self.club
|
||||
kwargs["club"] = self.club
|
||||
return kwargs
|
||||
|
||||
|
||||
class PosterCreateBaseView(CreateView):
|
||||
"""Create communication poster"""
|
||||
|
||||
current_tab = "posters"
|
||||
form_class = PosterForm
|
||||
template_name = 'core/create.jinja'
|
||||
template_name = "core/create.jinja"
|
||||
|
||||
def get_queryset(self):
|
||||
return Poster.objects.all()
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if 'club_id' in kwargs:
|
||||
self.club = get_object_or_404(Club, pk=kwargs['club_id'])
|
||||
if "club_id" in kwargs:
|
||||
self.club = get_object_or_404(Club, pk=kwargs["club_id"])
|
||||
return super(PosterCreateBaseView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(PosterCreateBaseView, self).get_form_kwargs()
|
||||
kwargs.update({'user': self.request.user})
|
||||
kwargs.update({"user": self.request.user})
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterCreateBaseView, self).get_context_data(**kwargs)
|
||||
if not self.request.user.is_com_admin:
|
||||
kwargs['club'] = self.club
|
||||
kwargs["club"] = self.club
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
@ -566,27 +689,28 @@ class PosterCreateBaseView(CreateView):
|
||||
|
||||
class PosterEditBaseView(UpdateView):
|
||||
"""Edit communication poster"""
|
||||
|
||||
pk_url_kwarg = "poster_id"
|
||||
current_tab = "posters"
|
||||
form_class = PosterForm
|
||||
template_name = 'com/poster_edit.jinja'
|
||||
template_name = "com/poster_edit.jinja"
|
||||
|
||||
def get_initial(self):
|
||||
init = {}
|
||||
try:
|
||||
init['date_begin'] = self.object.date_begin.strftime('%Y-%m-%d %H:%M:%S')
|
||||
init["date_begin"] = self.object.date_begin.strftime("%Y-%m-%d %H:%M:%S")
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
init['date_end'] = self.object.date_end.strftime('%Y-%m-%d %H:%M:%S')
|
||||
init["date_end"] = self.object.date_end.strftime("%Y-%m-%d %H:%M:%S")
|
||||
except Exception:
|
||||
pass
|
||||
return init
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if 'club_id' in kwargs and kwargs['club_id']:
|
||||
if "club_id" in kwargs and kwargs["club_id"]:
|
||||
try:
|
||||
self.club = Club.objects.get(pk=kwargs['club_id'])
|
||||
self.club = Club.objects.get(pk=kwargs["club_id"])
|
||||
except Club.DoesNotExist:
|
||||
raise PermissionDenied
|
||||
return super(PosterEditBaseView, self).dispatch(request, *args, **kwargs)
|
||||
@ -596,13 +720,13 @@ class PosterEditBaseView(UpdateView):
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(PosterEditBaseView, self).get_form_kwargs()
|
||||
kwargs.update({'user': self.request.user})
|
||||
kwargs.update({"user": self.request.user})
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterEditBaseView, self).get_context_data(**kwargs)
|
||||
if not self.request.user.is_com_admin:
|
||||
kwargs['club'] = self.club
|
||||
kwargs["club"] = self.club
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
@ -613,15 +737,16 @@ class PosterEditBaseView(UpdateView):
|
||||
|
||||
class PosterDeleteBaseView(DeleteView):
|
||||
"""Edit communication poster"""
|
||||
|
||||
pk_url_kwarg = "poster_id"
|
||||
current_tab = "posters"
|
||||
model = Poster
|
||||
template_name = 'core/delete_confirm.jinja'
|
||||
template_name = "core/delete_confirm.jinja"
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if 'club_id' in kwargs and kwargs['club_id']:
|
||||
if "club_id" in kwargs and kwargs["club_id"]:
|
||||
try:
|
||||
self.club = Club.objects.get(pk=kwargs['club_id'])
|
||||
self.club = Club.objects.get(pk=kwargs["club_id"])
|
||||
except Club.DoesNotExist:
|
||||
raise PermissionDenied
|
||||
return super(PosterDeleteBaseView, self).dispatch(request, *args, **kwargs)
|
||||
@ -632,107 +757,117 @@ class PosterListView(IsComAdminMixin, ComTabsMixin, PosterListBaseView):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterListView, self).get_context_data(**kwargs)
|
||||
kwargs['app'] = "com"
|
||||
kwargs["app"] = "com"
|
||||
return kwargs
|
||||
|
||||
|
||||
class PosterCreateView(IsComAdminMixin, ComTabsMixin, PosterCreateBaseView):
|
||||
"""Create communication poster"""
|
||||
success_url = reverse_lazy('com:poster_list')
|
||||
|
||||
success_url = reverse_lazy("com:poster_list")
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterCreateView, self).get_context_data(**kwargs)
|
||||
kwargs['app'] = "com"
|
||||
kwargs["app"] = "com"
|
||||
return kwargs
|
||||
|
||||
|
||||
class PosterEditView(IsComAdminMixin, ComTabsMixin, PosterEditBaseView):
|
||||
"""Edit communication poster"""
|
||||
success_url = reverse_lazy('com:poster_list')
|
||||
|
||||
success_url = reverse_lazy("com:poster_list")
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterEditView, self).get_context_data(**kwargs)
|
||||
kwargs['app'] = "com"
|
||||
kwargs["app"] = "com"
|
||||
return kwargs
|
||||
|
||||
|
||||
class PosterDeleteView(IsComAdminMixin, ComTabsMixin, PosterDeleteBaseView):
|
||||
"""Delete communication poster"""
|
||||
success_url = reverse_lazy('com:poster_list')
|
||||
|
||||
success_url = reverse_lazy("com:poster_list")
|
||||
|
||||
|
||||
class PosterModerateListView(IsComAdminMixin, ComTabsMixin, ListView):
|
||||
"""Moderate list communication poster"""
|
||||
|
||||
current_tab = "posters"
|
||||
model = Poster
|
||||
template_name = 'com/poster_moderate.jinja'
|
||||
template_name = "com/poster_moderate.jinja"
|
||||
queryset = Poster.objects.filter(is_moderated=False).all()
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterModerateListView, self).get_context_data(**kwargs)
|
||||
kwargs['app'] = "com"
|
||||
kwargs["app"] = "com"
|
||||
return kwargs
|
||||
|
||||
|
||||
class PosterModerateView(IsComAdminMixin, ComTabsMixin, View):
|
||||
"""Moderate communication poster"""
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
obj = get_object_or_404(Poster, pk=kwargs['object_id'])
|
||||
obj = get_object_or_404(Poster, pk=kwargs["object_id"])
|
||||
if obj.can_be_moderated_by(request.user):
|
||||
obj.is_moderated = True
|
||||
obj.moderator = request.user
|
||||
obj.save()
|
||||
return redirect('com:poster_moderate_list')
|
||||
return redirect("com:poster_moderate_list")
|
||||
raise PermissionDenied
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(PosterModerateListView, self).get_context_data(**kwargs)
|
||||
kwargs['app'] = "com"
|
||||
kwargs["app"] = "com"
|
||||
return kwargs
|
||||
|
||||
|
||||
class ScreenListView(IsComAdminMixin, ComTabsMixin, ListView):
|
||||
"""List communication screens"""
|
||||
|
||||
current_tab = "screens"
|
||||
model = Screen
|
||||
template_name = 'com/screen_list.jinja'
|
||||
template_name = "com/screen_list.jinja"
|
||||
|
||||
|
||||
class ScreenSlideshowView(DetailView):
|
||||
"""Slideshow of actives posters"""
|
||||
|
||||
pk_url_kwarg = "screen_id"
|
||||
model = Screen
|
||||
template_name = 'com/screen_slideshow.jinja'
|
||||
template_name = "com/screen_slideshow.jinja"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super(ScreenSlideshowView, self).get_context_data(**kwargs)
|
||||
kwargs['posters'] = self.object.active_posters()
|
||||
kwargs["posters"] = self.object.active_posters()
|
||||
return kwargs
|
||||
|
||||
|
||||
class ScreenCreateView(IsComAdminMixin, ComTabsMixin, CreateView):
|
||||
"""Create communication screen"""
|
||||
|
||||
current_tab = "screens"
|
||||
model = Screen
|
||||
fields = ['name', ]
|
||||
template_name = 'core/create.jinja'
|
||||
success_url = reverse_lazy('com:screen_list')
|
||||
fields = ["name"]
|
||||
template_name = "core/create.jinja"
|
||||
success_url = reverse_lazy("com:screen_list")
|
||||
|
||||
|
||||
class ScreenEditView(IsComAdminMixin, ComTabsMixin, UpdateView):
|
||||
"""Edit communication screen"""
|
||||
|
||||
pk_url_kwarg = "screen_id"
|
||||
current_tab = "screens"
|
||||
model = Screen
|
||||
fields = ['name', ]
|
||||
template_name = 'com/screen_edit.jinja'
|
||||
success_url = reverse_lazy('com:screen_list')
|
||||
fields = ["name"]
|
||||
template_name = "com/screen_edit.jinja"
|
||||
success_url = reverse_lazy("com:screen_list")
|
||||
|
||||
|
||||
class ScreenDeleteView(IsComAdminMixin, ComTabsMixin, DeleteView):
|
||||
"""Delete communication screen"""
|
||||
|
||||
pk_url_kwarg = "screen_id"
|
||||
current_tab = "screens"
|
||||
model = Screen
|
||||
template_name = 'core/delete_confirm.jinja'
|
||||
success_url = reverse_lazy('com:screen_list')
|
||||
template_name = "core/delete_confirm.jinja"
|
||||
success_url = reverse_lazy("com:screen_list")
|
||||
|
Reference in New Issue
Block a user