diff --git a/allianceauth/optimer/admin.py b/allianceauth/optimer/admin.py index 72b8767a..c097170c 100644 --- a/allianceauth/optimer/admin.py +++ b/allianceauth/optimer/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from allianceauth.optimer.models import OpTimer +from allianceauth.optimer.models import OpTimer, OpTimerType +admin.site.register(OpTimerType) admin.site.register(OpTimer) diff --git a/allianceauth/optimer/form.py b/allianceauth/optimer/form.py index 620616d3..8fb97c91 100644 --- a/allianceauth/optimer/form.py +++ b/allianceauth/optimer/form.py @@ -1,11 +1,34 @@ from django import forms from django.utils.translation import ugettext_lazy as _ +from allianceauth.optimer.form_widgets import DataListWidget + class OpForm(forms.Form): + """ + Create/Edit Fleet Operation Form + """ + doctrine = forms.CharField(max_length=254, required=True, label=_('Doctrine')) system = forms.CharField(max_length=254, required=True, label=_("System")) start = forms.DateTimeField(required=True, label=_("Start Time")) - duration = forms.CharField(max_length=254, required=True, label=_("Duration")) operation_name = forms.CharField(max_length=254, required=True, label=_("Operation Name")) + type = forms.CharField(required=False, label=_("Operation Type")) fc = forms.CharField(max_length=254, required=True, label=_("Fleet Commander")) + duration = forms.CharField(max_length=254, required=True, label=_("Duration")) + description = forms.CharField( + widget=forms.Textarea(attrs={"rows": 10, "cols": 20, "input_type": "textarea"}), + required=False, + label=_("Additional Info"), + help_text=_("(Optional) Describe the operation with a couple of short words."), + ) + + def __init__(self, *args, **kwargs): + _data_list = kwargs.pop('data_list', None) + + super().__init__(*args, **kwargs) + + # Add the DataListWidget to our type field + self.fields['type'].widget = DataListWidget( + data_list=_data_list, name='data-list' + ) diff --git a/allianceauth/optimer/form_widgets.py b/allianceauth/optimer/form_widgets.py new file mode 100644 index 00000000..3cd313b8 --- /dev/null +++ b/allianceauth/optimer/form_widgets.py @@ -0,0 +1,45 @@ +""" +Form Widgets +""" + +from django import forms + + +class DataListWidget(forms.TextInput): + """ + DataListWidget + + Draws an HTML5 datalist form field + """ + + def __init__(self, data_list, name, *args, **kwargs): + super().__init__(*args, **kwargs) + + self._name = name + self._list = data_list + self.attrs.update({"list": "list__%s" % self._name}) + + def render(self, name, value, attrs=None, renderer=None): + """ + Render the DataList + :param name: + :type name: + :param value: + :type value: + :param attrs: + :type attrs: + :param renderer: + :type renderer: + :return: + :rtype: + """ + + text_html = super().render(name, value, attrs=attrs) + data_list = '" + + return text_html + data_list diff --git a/allianceauth/optimer/migrations/0005_add_type_and_description.py b/allianceauth/optimer/migrations/0005_add_type_and_description.py new file mode 100644 index 00000000..c8fee43d --- /dev/null +++ b/allianceauth/optimer/migrations/0005_add_type_and_description.py @@ -0,0 +1,50 @@ +# Generated by Django 3.2.8 on 2021-10-26 16:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("optimer", "0004_on_delete"), + ] + + operations = [ + migrations.CreateModel( + name="OpTimerType", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("type", models.CharField(default="", max_length=254)), + ], + options={ + "ordering": ["type"], + "default_permissions": (), + }, + ), + migrations.AlterModelOptions( + name="optimer", + options={"default_permissions": (), "ordering": ["start"]}, + ), + migrations.AddField( + model_name="optimer", + name="description", + field=models.TextField(blank=True, default=""), + ), + migrations.AddField( + model_name="optimer", + name="type", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="optimer.optimertype", + ), + ), + ] diff --git a/allianceauth/optimer/models.py b/allianceauth/optimer/models.py index 08a17e3e..0479dca6 100644 --- a/allianceauth/optimer/models.py +++ b/allianceauth/optimer/models.py @@ -6,9 +6,25 @@ from django.utils import timezone from allianceauth.eveonline.models import EveCharacter +class OpTimerType(models.Model): + """ + Optimer Type + """ + + type = models.CharField(max_length=254, default="") + + def __str__(self): + return self.type + + class Meta: + ordering = ['type'] + default_permissions = () + + class OpTimer(models.Model): class Meta: ordering = ['start'] + default_permissions = () doctrine = models.CharField(max_length=254, default="") system = models.CharField(max_length=254, default="") @@ -17,7 +33,10 @@ class OpTimer(models.Model): operation_name = models.CharField(max_length=254, default="") fc = models.CharField(max_length=254, default="") post_time = models.DateTimeField(default=timezone.now) - eve_character = models.ForeignKey(EveCharacter, null=True, on_delete=models.SET_NULL) + eve_character = models.ForeignKey(EveCharacter, null=True, + on_delete=models.SET_NULL) + description = models.TextField(blank=True, default="") + type = models.ForeignKey(OpTimerType, null=True, on_delete=models.SET_NULL) def __str__(self): return self.operation_name diff --git a/allianceauth/optimer/templates/optimer/fleetoptable.html b/allianceauth/optimer/templates/optimer/fleetoptable.html index f95099dc..cb5d89e7 100644 --- a/allianceauth/optimer/templates/optimer/fleetoptable.html +++ b/allianceauth/optimer/templates/optimer/fleetoptable.html @@ -6,37 +6,48 @@
{% translate "Operation Name" %} | -{% translate "Doctrine" %} | -{% translate "Form Up System" %} | -{% translate "Start Time" %} | -{% translate "Local Time" %} | -{% translate "Duration" %} | -{% translate "FC" %} | +{% translate "Operation Name" %} | +{% translate "Description" %} | +{% translate "Doctrine" %} | +{% translate "Form Up System" %} | +{% translate "Start Time" %} | +{% translate "Local Time" %} | +{% translate "Duration" %} | +{% translate "FC" %} | {% if perms.auth.optimer_management %} -{% translate "Creator" %} | -{% translate "Action" %} | +{#{% translate "Creator" %} | #} +{% translate "Action" %} | {% endif %}
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
{{ ops.operation_name }} | -{{ ops.doctrine }} | -+ |
+ {{ ops.operation_name }}
+ {% if ops.type %}
+ ({{ ops.type }}) + {% endif %} + |
+ {{ ops.description }} | +{{ ops.doctrine }} | +{{ ops.system }} | -{{ ops.start | date:"Y-m-d H:i" }} | -- | {{ ops.duration }} | -{{ ops.fc }} | +{{ ops.start | date:"Y-m-d H:i" }} | ++ | {{ ops.duration }} | +{{ ops.fc }} | {% if perms.auth.optimer_management %} -{{ ops.eve_character }} | -+{# | {{ ops.eve_character }} | #} +- - + + + + + + | {% endif %}