diff --git a/app/interface/forms.py b/app/interface/forms.py index 9e9e541..85aa1eb 100644 --- a/app/interface/forms.py +++ b/app/interface/forms.py @@ -1,29 +1,37 @@ from django import forms from crispy_forms.helper import FormHelper -from crispy_forms.layout import Submit +from crispy_forms.layout import Submit, HTML, Div +from crispy_bulma.layout import FormGroup from . import models, fields class BaseForm(forms.Form): - + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.helper = self.get_form_helper() def get_form_helper(self): helper = FormHelper(self) - helper.add_input(Submit('submit', 'Submit', css_class='button is-link')) + #helper.add_input(Submit('submit', 'Submit', css_class='button is-link')) + #helper.layout.subm append(HTML('Cancel')) + #print(helper.layout) + helper.layout.append(FormGroup( + Submit('submit', 'Save', css_class="button is-primary"), + HTML('{% if view.cancel_url %}
{% endif %}') + )) return helper class ProjectForm(forms.ModelForm, BaseForm): + class Meta: model = models.Project fields = ['name', 'description', 'event_date'] - widgets = { - 'event_date': forms.DateTimeInput(attrs={'type': 'date'}) - } + #widgets = { + # 'event_date': forms.DateTimeInput(attrs={'type': 'date'}) + #} class ResourceForm(forms.ModelForm, BaseForm): @@ -36,6 +44,12 @@ class ResourceForm(forms.ModelForm, BaseForm): helper[3].wrap(fields.BulmaFileUpload) return helper +class WikiForm(forms.ModelForm, BaseForm): + + class Meta: + model = models.WikiPage + fields = ['title', 'markdown'] + class CodeForm(BaseForm): code = forms.CharField(max_length=14, widget=forms.TextInput(attrs={'placeholder': 'xxx-xxx-xxx', 'inputmode': 'numeric'})) diff --git a/app/interface/migrations/0002_auto_20230202_0804.py b/app/interface/migrations/0002_auto_20230202_0804.py new file mode 100644 index 0000000..ece531d --- /dev/null +++ b/app/interface/migrations/0002_auto_20230202_0804.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.7 on 2023-02-01 21:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('interface', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='project', + options={'ordering': ['active', 'event_date']}, + ), + migrations.RemoveField( + model_name='ensemble', + name='code', + ), + migrations.RemoveField( + model_name='ensemble', + name='passphrase', + ), + ] diff --git a/app/interface/models.py b/app/interface/models.py index 261eb75..ac9a60f 100644 --- a/app/interface/models.py +++ b/app/interface/models.py @@ -8,8 +8,6 @@ from byostorage.user import BYOStorage import random - -from datetime import datetime from urllib.parse import urlparse import os.path @@ -27,8 +25,13 @@ def rough_date(d): in_past = days < 0 if in_past: days = abs(days) - if days ==0: - return "today!" + if days == 0: + m = int((d-timezone.now()).seconds/60) + if m > 60: + return in_past, "{0:d} hours".format(int(m / 60)) + return in_past, "{0:d} minutes!".format(int(m % 60)) + if days >= 14: + return in_past, "{0:d} weeks".format(int(days/7)) if days >= 7: return in_past, "{0:d} weeks, {1:d} days".format(int(days / 7), int(days % 7)) return in_past, f"{days} days" @@ -45,23 +48,33 @@ class Ensemble(models.Model): help_text="Display name") slug = models.SlugField(max_length=100, editable=False, unique=True, help_text="Short name for the ensemble - used for folders") - code = models.CharField(max_length=9, default=generate_code, - help_text="Ensemble registration code") - passphrase = models.CharField(max_length=100, - help_text="Used to register ensembles") + #code = models.CharField(max_length=9, default=generate_code, + # help_text="Ensemble registration code") + #passphrase = models.CharField(max_length=100, + # help_text="Used to register ensembles") admins = models.ManyToManyField('auth.User', related_name='ensembles') details = models.TextField(blank=True, help_text="Description of the ensemble (markdown)") storage = models.ForeignKey('byostorage.UserStorage', null=True, on_delete=models.SET_NULL, help_text="Default storage for this ensemble") + class Meta: + ordering = ('slug', ) + def active_projects(self): - return self.projects.filter(active=True).order_by('event_date') + return self.projects.filter(active=True, event_date__gte=timezone.now()) def ensemble_code(self): code = str(self.code) return "{}-{}-{}".format(code[:3], code[3:6], code[6:]) + def has_admin(self, user): + if not user.is_authenticated: + return False + if user.is_superuser: + return True + return user.pk in self.admins.values_list('pk', flat=True) + def save(self, **kwargs): if not self.slug: self.slug = slugify(self.name) @@ -83,7 +96,7 @@ class Project(models.Model): owner = models.CharField(max_length=255, blank=True) class Meta: - ordering = ['active', '-pk'] + ordering = ['active', 'event_date'] @property def days(self): @@ -104,8 +117,13 @@ class Project(models.Model): @property def folder(self): - print(f"{self.ensemble.storage_id}:{self.ensemble.slug}/{self.slug}") - return f"{self.ensemble.storage_id}:{self.ensemble.slug}/{self.slug}" + project = slugify(self.name) + print(f"{self.ensemble.storage_id}:{self.ensemble.slug}/{project}") + return f"{self.ensemble.storage_id}:{self.ensemble.slug}/{project}" + + @property + def active_modules(self): + return self.modules.values_list('name', flat=True) def __str__(self): return self.name diff --git a/app/interface/templates/403.html b/app/interface/templates/403.html new file mode 100644 index 0000000..b799d5d --- /dev/null +++ b/app/interface/templates/403.html @@ -0,0 +1,8 @@ +{% extends "interface/project_base.html" %} + +{% block page %} +{{ exception }}
+{{ exception }}
+{{ instructions }}
+ {% endif %} {% crispy form %}{{ ensemble.details|markdown }}
-{% block content %} -{{ ensemble.details }}
Admin Details
+
+ Joining instructions for participants
+ URL: {{ ensemble_link }}
+
{{ projects }} active project{{ projects|pluralize }}
- {% endwith %} +
+ {{ project.name }}
- -
- {% if project.deadline %}In {{ project.deadline|timeuntil }}
{% endif %}
- {% if project.works.count %}
-
- {{ project.works.count }} works
-
-
- {% endif %}
- {% if project.submissions.count %}{{ project.submissions.count }} submissions
{% endif %}
-
No projects currently planned
-Go put your feet up!
-Admin Details
-
- Joining instructions for participants
- URL: {{ ensemble_url }}
- Code: {{ ensemble.ensemble_code }}
- Passphrase: {{ ensemble.passphrase }}
-
{{ instructions }}
- {% endif %} - {% crispy form %} -{{ instructions }}
- +{{ instructions }}
+ {% endif %} + {% crispy form %} +
Login is only required to administer a project.
- If you have an ensemble code enter it here instead.