Compare commits
3 commits
7c7ffee1f3
...
b3ba6caa07
Author | SHA1 | Date | |
---|---|---|---|
b3ba6caa07 | |||
8da844d2e4 | |||
660c1e75e6 |
|
@ -18,7 +18,7 @@ class RaidCommentInline(admin.TabularInline):
|
||||||
|
|
||||||
@admin.register(Raid)
|
@admin.register(Raid)
|
||||||
class RaidAdmin(admin.ModelAdmin):
|
class RaidAdmin(admin.ModelAdmin):
|
||||||
list_display = ["title", "date", "signup_deadline"]
|
list_display = ["title", "date", "response_deadline"]
|
||||||
search_fields = ["title"]
|
search_fields = ["title"]
|
||||||
inlines = [RaidResponseInline, RaidCommentInline]
|
inlines = [RaidResponseInline, RaidCommentInline]
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ class RaidResponseForm(ModelForm):
|
||||||
class RaidForm(ModelForm):
|
class RaidForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Raid
|
model = Raid
|
||||||
fields = ["title", "description", "date", "signup_deadline"]
|
fields = ["title", "description", "date", "response_deadline"]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
@ -78,7 +78,7 @@ class RaidForm(ModelForm):
|
||||||
Field("description"),
|
Field("description"),
|
||||||
Row(
|
Row(
|
||||||
Column("date", css_class="form-group col-md-6"),
|
Column("date", css_class="form-group col-md-6"),
|
||||||
Column("signup_deadline", css_class="form-group col-md-6"),
|
Column("response_deadline", css_class="form-group col-md-6"),
|
||||||
),
|
),
|
||||||
submit_button
|
submit_button
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 2.2.6 on 2019-10-25 01:58
|
# Generated by Django 2.2.6 on 2019-10-25 13:23
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ class Migration(migrations.Migration):
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('name', models.CharField(max_length=100, unique=True)),
|
('name', models.CharField(max_length=100, unique=True)),
|
||||||
('date', models.DateField(help_text='Some date where the instance was reset in the past.')),
|
('date', models.DateField(help_text='Some date where the instance was reset in the past.')),
|
||||||
('time', models.TimeField()),
|
('time', models.TimeField(help_text='The time of day where the instance resets.')),
|
||||||
('duration', models.DurationField(help_text='Resets are calculated from the given date in intervals of this duration.', verbose_name='lockout duration')),
|
('duration', models.DurationField(help_text='Resets are calculated from the given date in intervals of this duration.', verbose_name='lockout duration')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
@ -31,7 +31,7 @@ class Migration(migrations.Migration):
|
||||||
('title', models.CharField(max_length=40)),
|
('title', models.CharField(max_length=40)),
|
||||||
('description', models.TextField(blank=True, null=True)),
|
('description', models.TextField(blank=True, null=True)),
|
||||||
('date', models.DateTimeField()),
|
('date', models.DateTimeField()),
|
||||||
('signup_deadline', models.DateTimeField(blank=True, help_text='Defaults to date and time of raid if not set.')),
|
('response_deadline', models.DateTimeField(blank=True, help_text='Defaults to 24 hours before date and time of raid if not set.')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ['-date'],
|
'ordering': ['-date'],
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 2.2.6 on 2019-10-25 01:58
|
# Generated by Django 2.2.6 on 2019-10-25 13:23
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
|
@ -1,3 +1,5 @@
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
@ -16,18 +18,19 @@ class Raid(models.Model):
|
||||||
)
|
)
|
||||||
|
|
||||||
date = models.DateTimeField()
|
date = models.DateTimeField()
|
||||||
signup_deadline = models.DateTimeField(
|
response_deadline = models.DateTimeField(
|
||||||
blank=True,
|
blank=True,
|
||||||
help_text="Defaults to date and time of raid if not set."
|
help_text="Defaults to 24 hours before date and time of raid if not set."
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ["-date"]
|
ordering = ["-date"]
|
||||||
|
|
||||||
def clean(self):
|
def save(self, *args, **kwargs):
|
||||||
# Set the signup deadline to the date/time of the raid if it hasn't been set already
|
if self.response_deadline is None:
|
||||||
if self.signup_deadline is None:
|
self.response_deadline = self.date - timedelta(hours=24)
|
||||||
self.signup_deadline = self.date
|
|
||||||
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.title} on {self.date}"
|
return f"{self.title} on {self.date}"
|
||||||
|
@ -141,7 +144,9 @@ class InstanceReset(models.Model):
|
||||||
date = models.DateField(
|
date = models.DateField(
|
||||||
help_text="Some date where the instance was reset in the past."
|
help_text="Some date where the instance was reset in the past."
|
||||||
)
|
)
|
||||||
time = models.TimeField()
|
time = models.TimeField(
|
||||||
|
help_text="The time of day where the instance resets."
|
||||||
|
)
|
||||||
duration = models.DurationField(
|
duration = models.DurationField(
|
||||||
"lockout duration",
|
"lockout duration",
|
||||||
help_text="Resets are calculated from the given date in intervals of this duration."
|
help_text="Resets are calculated from the given date in intervals of this duration."
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
</h4>
|
</h4>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<p class="card-text">{{ raid.description | linebreaksbr | default:"<em>No description</em>" }}</p>
|
<p class="card-text">{{ raid.description | linebreaksbr | default:"<em>No description</em>" }}</p>
|
||||||
<p class="card-text"><small class="text-muted">Sign up deadline: {{ raid.signup_deadline }}</small></p>
|
<p class="card-text"><small class="text-muted">Response deadline: {{ raid.response_deadline }}</small></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% if response_form %}
|
{% if response_form %}
|
||||||
|
|
|
@ -83,7 +83,7 @@ class RaidDetailView(SingleObjectMixin, MultiModelFormView):
|
||||||
classes = {
|
classes = {
|
||||||
"comment_form": RaidCommentForm
|
"comment_form": RaidCommentForm
|
||||||
}
|
}
|
||||||
if self.object.signup_deadline > timezone.now():
|
if self.object.response_deadline > timezone.now():
|
||||||
classes["response_form"] = RaidResponseForm
|
classes["response_form"] = RaidResponseForm
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
|
|
|
@ -8,5 +8,3 @@ class CharacterForm(ModelForm):
|
||||||
model = Character
|
model = Character
|
||||||
fields = ["name", "klass", "role"]
|
fields = ["name", "klass", "role"]
|
||||||
|
|
||||||
def clean_name(self):
|
|
||||||
return self.cleaned_data["name"].capitalize()
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 2.2.6 on 2019-10-25 01:58
|
# Generated by Django 2.2.6 on 2019-10-25 13:23
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.contrib.auth.validators
|
import django.contrib.auth.validators
|
||||||
|
@ -55,7 +55,7 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='user',
|
model_name='user',
|
||||||
name='main',
|
name='main',
|
||||||
field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='users.Character'),
|
field=models.OneToOneField(blank=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='users.Character'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='user',
|
model_name='user',
|
||||||
|
|
|
@ -12,22 +12,6 @@ class UserManager(DjangoUserManager):
|
||||||
avg_attendance=Avg("characters__raid_responses__attendance")
|
avg_attendance=Avg("characters__raid_responses__attendance")
|
||||||
)
|
)
|
||||||
|
|
||||||
@transaction.atomic
|
|
||||||
def _create_user(self, username, email, password, **extra_fields):
|
|
||||||
if "main" not in extra_fields:
|
|
||||||
main = Character.objects.create(
|
|
||||||
user=None,
|
|
||||||
name=username,
|
|
||||||
klass=Character.WARRIOR,
|
|
||||||
role=Character.DAMAGE
|
|
||||||
)
|
|
||||||
main.save()
|
|
||||||
extra_fields["main"] = main
|
|
||||||
user = super()._create_user(username, email, password, **extra_fields)
|
|
||||||
extra_fields["main"].user = user
|
|
||||||
extra_fields["main"].save()
|
|
||||||
return user
|
|
||||||
|
|
||||||
|
|
||||||
class User(AbstractUser):
|
class User(AbstractUser):
|
||||||
objects = UserManager()
|
objects = UserManager()
|
||||||
|
@ -38,7 +22,8 @@ class User(AbstractUser):
|
||||||
main = models.OneToOneField(
|
main = models.OneToOneField(
|
||||||
"Character",
|
"Character",
|
||||||
related_name="+",
|
related_name="+",
|
||||||
on_delete=models.PROTECT
|
on_delete=models.PROTECT,
|
||||||
|
blank=True
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -48,6 +33,22 @@ class User(AbstractUser):
|
||||||
if hasattr(self, "main") and self.main.user != self:
|
if hasattr(self, "main") and self.main.user != self:
|
||||||
raise ValidationError({"main": "Main character must be owned by user."})
|
raise ValidationError({"main": "Main character must be owned by user."})
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
if not hasattr(self, "main"):
|
||||||
|
self.main = Character.objects.create(
|
||||||
|
user=None,
|
||||||
|
name=self.username,
|
||||||
|
klass=Character.WARRIOR,
|
||||||
|
role=Character.DAMAGE
|
||||||
|
)
|
||||||
|
self.main.save()
|
||||||
|
|
||||||
|
user = super().save(*args, **kwargs)
|
||||||
|
self.main.user = self
|
||||||
|
self.main.save()
|
||||||
|
return user
|
||||||
|
|
||||||
def avg_attendance(self):
|
def avg_attendance(self):
|
||||||
return self.avg_attendance
|
return self.avg_attendance
|
||||||
|
|
||||||
|
@ -107,5 +108,8 @@ class Character(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ["name"]
|
ordering = ["name"]
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
self.name = self.name.capitalize()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
Loading…
Reference in a new issue