mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-10 03:49:24 +00:00
refactor news model and creation form
This commit is contained in:
@ -0,0 +1,56 @@
|
||||
# Generated by Django 4.2.17 on 2024-12-16 14:51
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("club", "0011_auto_20180426_2013"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
("com", "0006_remove_sith_index_page"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="news",
|
||||
name="club",
|
||||
field=models.ForeignKey(
|
||||
help_text="The club which organizes the event.",
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="news",
|
||||
to="club.club",
|
||||
verbose_name="club",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="news",
|
||||
name="content",
|
||||
field=models.TextField(
|
||||
blank=True,
|
||||
default="",
|
||||
help_text="A more detailed and exhaustive description of the event.",
|
||||
verbose_name="content",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="news",
|
||||
name="moderator",
|
||||
field=models.ForeignKey(
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="moderated_news",
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
verbose_name="moderator",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="news",
|
||||
name="summary",
|
||||
field=models.TextField(
|
||||
help_text="A description of the event (what is the activity ? is there an associated clic ? is there a inscription form ?)",
|
||||
verbose_name="summary",
|
||||
),
|
||||
),
|
||||
]
|
@ -62,16 +62,31 @@ NEWS_TYPES = [
|
||||
|
||||
|
||||
class News(models.Model):
|
||||
"""The news class."""
|
||||
"""News about club events."""
|
||||
|
||||
title = models.CharField(_("title"), max_length=64)
|
||||
summary = models.TextField(_("summary"))
|
||||
content = models.TextField(_("content"))
|
||||
summary = models.TextField(
|
||||
_("summary"),
|
||||
help_text=_(
|
||||
"A description of the event (what is the activity ? "
|
||||
"is there an associated clic ? is there a inscription form ?)"
|
||||
),
|
||||
)
|
||||
content = models.TextField(
|
||||
_("content"),
|
||||
blank=True,
|
||||
default="",
|
||||
help_text=_("A more detailed and exhaustive description of the event."),
|
||||
)
|
||||
type = models.CharField(
|
||||
_("type"), max_length=16, choices=NEWS_TYPES, default="EVENT"
|
||||
)
|
||||
club = models.ForeignKey(
|
||||
Club, related_name="news", verbose_name=_("club"), on_delete=models.CASCADE
|
||||
Club,
|
||||
related_name="news",
|
||||
verbose_name=_("club"),
|
||||
on_delete=models.CASCADE,
|
||||
help_text=_("The club which organizes the event."),
|
||||
)
|
||||
author = models.ForeignKey(
|
||||
User,
|
||||
@ -85,7 +100,7 @@ class News(models.Model):
|
||||
related_name="moderated_news",
|
||||
verbose_name=_("moderator"),
|
||||
null=True,
|
||||
on_delete=models.CASCADE,
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
|
@ -34,43 +34,90 @@
|
||||
{% csrf_token %}
|
||||
{{ form.non_field_errors() }}
|
||||
{{ form.author }}
|
||||
<p>{{ form.type.errors }}<label for="{{ form.type.name }}">{{ form.type.label }}</label>
|
||||
<p>
|
||||
{{ form.type.errors }}
|
||||
<label for="{{ form.type.name }}" class="required">{{ form.type.label }}</label>
|
||||
<ul>
|
||||
<li>{% trans %}Notice: Information, election result - no date{% endtrans %}</li>
|
||||
<li>{% trans %}Event: punctual event, associated with one date{% endtrans %}</li>
|
||||
<li>{% trans %}Weekly: recurrent event, associated with many dates (specify the first one, and a deadline){% endtrans %}</li>
|
||||
<li>{% trans %}Call: long time event, associated with a long date (election appliance, ...){% endtrans %}</li>
|
||||
<li>
|
||||
{% trans trimmed%}
|
||||
Weekly: recurrent event, associated with many dates
|
||||
(specify the first one, and a deadline)
|
||||
{% endtrans %}
|
||||
</li>
|
||||
<li>
|
||||
{% trans trimmed %}
|
||||
Call: long time event, associated with a long date (like election appliance)
|
||||
{% endtrans %}
|
||||
</li>
|
||||
</ul>
|
||||
{{ form.type }}</p>
|
||||
<p class="date">{{ form.start_date.errors }}<label for="{{ form.start_date.name }}">{{ form.start_date.label }}</label> {{ form.start_date }}</p>
|
||||
<p class="date">{{ form.end_date.errors }}<label for="{{ form.end_date.name }}">{{ form.end_date.label }}</label> {{ form.end_date }}</p>
|
||||
<p class="until">{{ form.until.errors }}<label for="{{ form.until.name }}">{{ form.until.label }}</label> {{ form.until }}</p>
|
||||
<p>{{ form.title.errors }}<label for="{{ form.title.name }}">{{ form.title.label }}</label> {{ form.title }}</p>
|
||||
<p>{{ form.club.errors }}<label for="{{ form.club.name }}">{{ form.club.label }}</label> {{ form.club }}</p>
|
||||
<p>{{ form.summary.errors }}<label for="{{ form.summary.name }}">{{ form.summary.label }}</label> {{ form.summary }}</p>
|
||||
<p>{{ form.content.errors }}<label for="{{ form.content.name }}">{{ form.content.label }}</label> {{ form.content }}</p>
|
||||
{{ form.type }}
|
||||
</p>
|
||||
<p class="date">
|
||||
{{ form.start_date.errors }}
|
||||
<label for="{{ form.start_date.name }}">{{ form.start_date.label }}</label>
|
||||
{{ form.start_date }}
|
||||
</p>
|
||||
<p class="date">
|
||||
{{ form.end_date.errors }}
|
||||
<label for="{{ form.end_date.name }}">{{ form.end_date.label }}</label>
|
||||
{{ form.end_date }}
|
||||
</p>
|
||||
<p class="until">
|
||||
{{ form.until.errors }}
|
||||
<label for="{{ form.until.name }}">{{ form.until.label }}</label>
|
||||
{{ form.until }}
|
||||
</p>
|
||||
<p>
|
||||
{{ form.title.errors }}
|
||||
<label for="{{ form.title.name }}" class="required">{{ form.title.label }}</label>
|
||||
{{ form.title }}
|
||||
</p>
|
||||
<p>
|
||||
{{ form.club.errors }}
|
||||
<label for="{{ form.club.name }}" class="required">{{ form.club.label }}</label>
|
||||
<span class="helptext">{{ form.club.help_text }}</span>
|
||||
{{ form.club }}
|
||||
</p>
|
||||
<p>
|
||||
{{ form.summary.errors }}
|
||||
<label for="{{ form.summary.name }}" class="required">{{ form.summary.label }}</label>
|
||||
<span class="helptext">{{ form.summary.help_text }}</span>
|
||||
{{ form.summary }}
|
||||
</p>
|
||||
<p>
|
||||
{{ form.content.errors }}
|
||||
<label for="{{ form.content.name }}">{{ form.content.label }}</label>
|
||||
<span class="helptext">{{ form.content.help_text }}</span>
|
||||
{{ form.content }}
|
||||
</p>
|
||||
{% if user.is_com_admin %}
|
||||
<p>{{ form.automoderation.errors }}<label for="{{ form.automoderation.name }}">{{ form.automoderation.label }}</label>
|
||||
{{ form.automoderation }}</p>
|
||||
<p>
|
||||
{{ form.automoderation.errors }}
|
||||
<label for="{{ form.automoderation.name }}">{{ form.automoderation.label }}</label>
|
||||
{{ form.automoderation }}
|
||||
</p>
|
||||
{% endif %}
|
||||
<p><input type="submit" name="preview" value="{% trans %}Preview{% endtrans %}" /></p>
|
||||
<p><input type="submit" value="{% trans %}Save{% endtrans %}" /></p>
|
||||
<p><input type="submit" name="preview" value="{% trans %}Preview{% endtrans %}"/></p>
|
||||
<p><input type="submit" value="{% trans %}Save{% endtrans %}"/></p>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block script %}
|
||||
{{ super() }}
|
||||
<script>
|
||||
$( function() {
|
||||
var type = $('input[name=type]');
|
||||
var dates = $('.date');
|
||||
var until = $('.until');
|
||||
function update_targets () {
|
||||
type_checked = $('input[name=type]:checked');
|
||||
if (type_checked.val() == "EVENT" || type_checked.val() == "CALL") {
|
||||
$(function () {
|
||||
let type = $('input[name=type]');
|
||||
let dates = $('.date');
|
||||
let until = $('.until');
|
||||
|
||||
function update_targets() {
|
||||
const type_checked = $('input[name=type]:checked');
|
||||
if (["CALL", "EVENT"].includes(type_checked.val())) {
|
||||
dates.show();
|
||||
until.hide();
|
||||
} else if (type_checked.val() == "WEEKLY") {
|
||||
} else if (type_checked.val() === "WEEKLY") {
|
||||
dates.show();
|
||||
until.show();
|
||||
} else {
|
||||
@ -78,9 +125,10 @@
|
||||
until.hide();
|
||||
}
|
||||
}
|
||||
|
||||
update_targets();
|
||||
type.change(update_targets);
|
||||
} );
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
@ -223,15 +223,13 @@ class NewsForm(forms.ModelForm):
|
||||
):
|
||||
self.add_error(
|
||||
"end_date",
|
||||
ValidationError(
|
||||
_("You crazy? You can not finish an event before starting it.")
|
||||
),
|
||||
ValidationError(_("An event cannot end before its beginning.")),
|
||||
)
|
||||
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):
|
||||
def save(self, *args, **kwargs):
|
||||
ret = super().save()
|
||||
self.instance.dates.all().delete()
|
||||
if self.instance.type == "EVENT" or self.instance.type == "CALL":
|
||||
|
Reference in New Issue
Block a user