فهرست منبع

postgresql & some work on dancecalander

tBKwtWS 6 سال پیش
والد
کامیت
19c4ea7e2b

+ 1 - 0
requirements.txt

@@ -1,5 +1,6 @@
 Django==2.2.6
 django-settings-export==1.2.1
 pkg-resources==0.0.0
+psycopg2==2.8.4
 pytz==2019.2
 sqlparse==0.3.0

+ 25 - 0
website/dancecalendar/forms.py

@@ -0,0 +1,25 @@
+from django import forms
+from django.forms import ModelForm, CharField, SlugField
+from django.core.validators import validate_unicode_slug
+
+from .models import Event
+
+class EventForm(ModelForm):
+    class Meta:
+        model=Event
+        exclude=['slug']
+        labels={
+            'Name': '<i class="server icon"></i>Name',
+            'description': '<i class="dungeon icon"></i>Description',
+            'location': '<i class="lock icon"></i>Location',
+            # 'doors_open':
+            # 'doors_close':
+            # 'price':
+            # 'wardrobe':
+            # 'wardrobe_guarded':
+            # 'dresscode':
+        }
+        widgets={
+            'description': forms.Textarea(),
+            #'doors_open': forms.DateTimeInput()
+        }

+ 57 - 16
website/dancecalendar/models.py

@@ -1,16 +1,22 @@
 from django.db import models
-
+from django.core.validators import validate_unicode_slug, MaxLengthValidator#, MaxValueValidator, URLValidator
 # Create your models here.
 
-class Party(models.Model):
+class Event(models.Model):
+    slug = models.SlugField(
+        db_index=True,
+        unique=True,
+        validators=[validate_unicode_slug],
+    )
     name = models.CharField(
         max_length=50,
-        #unique=True,
+        validators=[MaxLengthValidator(50)],
     )
     description = models.CharField(
         null=True,
         blank=True,
         max_length=200,
+        validators=[MaxLengthValidator(200)],
     )
     location = models.ForeignKey(
         'Location',
@@ -39,32 +45,42 @@ class Party(models.Model):
     )
     dresscode = models.CharField(
         max_length=50,
+        validators=[MaxLengthValidator(50)],
     )
-    area = models.ForeignKey(
-        'Area',
-        on_delete=models.CASCADE,
-    )
+
+    #class Meta:
+    #    ordering = ['doors_open']
+
+    def __str__(self):
+        return self.name
+
 
 class Location(models.Model):
     name = models.CharField(
         max_length=50,
+        validators=[MaxLengthValidator(50)],
     )
     venue_type = models.CharField(
         max_length=30,
+        validators=[MaxLengthValidator(30)],
     )
     street = models.CharField(
         max_length=50,
+        validators=[MaxLengthValidator(50)],
     )
     housenumber = models.CharField(
         max_length=10,
+        validators=[MaxLengthValidator(10)],
     )
     city = models.CharField(
         max_length=30,
+        validators=[MaxLengthValidator(30)],
     )
     areacode = models.CharField(
         null=True,
         blank=True,
-        max_length=10
+        max_length=10,
+        validators=[MaxLengthValidator(10)],
     )
     free_parking = models.PositiveSmallIntegerField(
         default=False,
@@ -74,28 +90,33 @@ class Location(models.Model):
         constraints = [
             models.UniqueConstraint(fields=['street', 'housenumber'], name='unique location')
         ]
+        ordering = ['name']
 
-class Area(models.Model):
-    name = models.CharField(
-        max_length=50,
-        default='Main',
+    def __str__(self):
+        return self.name
+
+
+class Activity(models.Model):
+    event = models.ForeignKey(
+        'Event',
+        on_delete=models.CASCADE,
     )
-    activity = models.ForeignKey(
-        'Activity',
+    area = models.ForeignKey(
+        'Area',
         on_delete=models.CASCADE,
     )
-
-class Activity(models.Model):
     name = models.CharField(
         null=True,
         blank=True,
         max_length=50,
         default='Social',
+        validators=[MaxLengthValidator(50)],
     )
     description = models.CharField(
         null=True,
         blank=True,
         max_length=200,
+        validators=[MaxLengthValidator(200)],
     )
     TYPE_CHOICES = [
         ('Dance party',
@@ -106,6 +127,7 @@ class Activity(models.Model):
         ),
         ('ws', 'Workshop'),
         ('sh', 'Show'),
+        ('cl', 'Class'),
         ('br', 'Break'),
         ('ot', 'Other'),
     ]
@@ -113,6 +135,7 @@ class Activity(models.Model):
         max_length=2,
         choices=TYPE_CHOICES,
         default='sc',
+        validators=[MaxLengthValidator(2)],
     )
     start = models.DateTimeField()
     end = models.DateTimeField()
@@ -120,4 +143,22 @@ class Activity(models.Model):
         null=True,
         blank=True,
         max_length=50,
+        validators=[MaxLengthValidator(50)],
+    )
+
+    #class Meta:
+    #    ordering = ['name']
+
+    def __str__(self):
+        return self.name
+
+
+class Area(models.Model):
+    name = models.CharField(
+        max_length=50,
+        default='Main',
+        validators=[MaxLengthValidator(50)],
     )
+
+    def __str__(self):
+        return self.name

+ 48 - 0
website/dancecalendar/templates/dancecalendar/add_event.html

@@ -0,0 +1,48 @@
+{% extends "base.html" %}
+{% block content %}
+  <a href="{% url 'dancecalendar:add_event' %}" class="ui inverted right floated button">Add location</a>
+  <form class= "ui form" method="post" action="{% block formtag %}{% endblock formtag %}">
+    {% csrf_token %}
+    {{ form.non_field_errors }}
+    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
+    <div class="two fields">
+      <div class="required field{% if form.name.errors %} error{% endif %}">
+        <label for="{{ form.name.id_for_label }}">{{ form.name.label|safe }}</label>
+        {{ form.name }}
+        {% if form.name.errors %}
+          <div class="ui inverted red message">
+            {{ form.name.errors }}
+          </div>
+        {% endif %}
+      </div>
+      <div class="required field{% if form.location.errors %} error{% endif %}">
+        <label for="{{ form.location.id_for_label }}">{{ form.location.label|safe }}</label>
+        {{ form.location }}
+        {% if form.location.errors %}
+          <div class="ui inverted red message">
+            {{ form.location.errors }}
+          </div>
+        {% endif %}
+      </div>
+    </div>
+    <div class="field{% if form.description.errors %} error{% endif %}">
+      <label for="{{ form.description.id_for_label }}">{{ form.description.label|safe }}</label>
+      {{ form.description }}
+      {% if form.description.errors %}
+        <div class="ui inverted red message">
+          {{ form.description.errors }}
+        </div>
+      {% endif %}
+    </div>
+    <div class="field{% if form.doors_open.errors %} error{% endif %}">
+      <label for="{{ form.doors_open.id_for_label }}">{{ form.doors_open.label|safe }}</label>
+      {{ form.doors_open }}
+      {% if form.doors_open.errors %}
+        <div class="ui inverted red message">
+          {{ form.doors_open.errors }}
+        </div>
+      {% endif %}
+    </div>
+    
+  </form>
+{% endblock %}

+ 1 - 1
website/dancecalendar/templates/dancecalendar/index.html

@@ -1,4 +1,4 @@
 {% extends "base.html" %}
 {% block content %}
-  dancecalendar
+  <a href="{% url 'dancecalendar:add_event' %}" class="ui inverted right floated button">Add</a>
 {% endblock %}

+ 3 - 0
website/dancecalendar/urls.py

@@ -5,4 +5,7 @@ from . import views
 app_name = 'dancecalendar'
 urlpatterns = [
     path('', views.index, name='index'),
+    path('events/', views.events, name='events'),
+    path('event/add/', views.add_event, name='add_event'),
+    path('event/<str:network_slug>/', views.event, name='event'),
 ]

+ 44 - 3
website/dancecalendar/views.py

@@ -1,12 +1,53 @@
 from django.shortcuts import render
+from django.contrib.auth.decorators import login_required, permission_required
+
+from .forms import EventForm
+
+def keywords(additional_keywords=None):
+    default_keywords = 'Dance calander, '
+    if additional_keywords:
+        additional_keywords = ', '.join(map(str, additional_keywords))
+    return (default_keywords + additional_keywords)
 
-# Create your views here.
 
 def index(request):
     context = {
         'title': 'Dance calendar',
         'icon': 'calendar alternate outline',
-        'description': 'Dance parties',
-        'keywords': 'Dance calendar',
+        'description': 'Calendar of dance events.',
+        'keywords': keywords(('index')),
     }
     return render(request, 'dancecalendar/index.html', context)
+
+def events(request):
+    context = {
+        'parent_title': 'Dance calendar',
+        'parent_url': 'dancecalendar:index',
+        'parent_icon': 'calander alternate outline',
+        'title': 'Events',
+        'icon': 'sitemap',
+        'description': 'List of events from the dance calander',
+        'keywords': keywords(('events', 'list', 'eventlist', 'event list', 'list of events')),
+    }
+    return render(request, 'dancecalendar/events.html', context)
+
+@login_required
+@permission_required('dancecalendar.add_evet', raise_exception=True)
+def add_event(request):
+    if request.method == 'POST':
+        pass
+    else:   # Not a post request.
+        form = EventForm()
+    context = {
+        'parent_title': 'Dance calendar',
+        'parent_url': 'dancecalendar:index',
+        'parent_icon': 'calander alternate outline',
+        'title': 'Add event',
+        'icon': 'sitemap',
+        'description': 'Add an event to the dance calander',
+        'keywords': keywords(('add', 'event', 'add event')),
+        'form': form,
+    }
+    return render(request, 'dancecalendar/add_event.html', context)
+def event(request):
+    pass

+ 11 - 13
website/rotbot/templates/rotbot/network_form.html

@@ -14,7 +14,7 @@
         </div>
       {% endif %}
     </div>
-    <div class="required field">
+    <div class="required field{% if form.slug.errors %} error{% endif %}">
       <label for="{{ form.slug.id_for_label }}">{{ form.slug.label|safe }}</label>
       {{ form.slug }}
       {% if form.slug.errors %}
@@ -29,7 +29,7 @@
     {{ hostform.non_field_errors }}
     {% for field in hostform.hidden_fields %}{{ field }}{% endfor %}
     <div class="four fields">
-      <div class="required field">
+      <div class="required field{% if hostform.address.errors %} error{% endif %}">
         <label for="{{ hostform.address.id_for_label }}">{{ hostform.address.label|safe }}</label>
         {{ hostform.address }}
         {% if hostform.address.errors %}
@@ -38,7 +38,7 @@
           </div>
         {% endif %}
       </div>
-      <div class="required field">
+      <div class="required field{% if hostform.port.errors %} error{% endif %}">
         <label for="{{ hostform.port.id_for_label }}">{{ hostform.port.label|safe }}</label>
         {{ hostform.port }}
         {% if hostform.port.errors %}
@@ -47,7 +47,7 @@
           </div>
         {% endif %}
       </div>
-      <div class="field">
+      <div class="field{% if hostform.ssl.errors %} error{% endif %}">
         <div class="ui inverted toggle checkbox">
           {{ hostform.ssl }}
           <label for="{{ hostform.ssl.id_for_label }}">{{ hostform.ssl.label|safe }}</label>
@@ -56,7 +56,6 @@
               {{ hostform.port.errors }}
             </div>
           {% endif %}
-
         </div>
       </div>
       <div class="field">
@@ -76,9 +75,8 @@
       </div>
     </div>
   {% endfor %}
-
   <div class="three fields">
-    <div class="required field">
+    <div class="required field{% if form.nickname.errors %} error{% endif %}">
       <label for="{{ form.nickname.id_for_label }}">{{ form.nickname.label|safe }}</label>
       {{ form.nickname }}
       {% if form.nickname.errors %}
@@ -87,7 +85,7 @@
         </div>
       {% endif %}
     </div>
-    <div class="field">
+    <div class="field{% if form.password.errors %} error{% endif %}">
       <label for="{{ form.password.id_for_label }}">{{ form.password.label|safe }}</label>
       {{ form.password }}
       {% if form.password.errors %}
@@ -96,7 +94,7 @@
         </div>
       {% endif %}
     </div>
-    <div class="required field">
+    <div class="required field{% if form.username.errors %} error{% endif %}">
       <label for="{{ form.username.id_for_label }}">{{ form.username.label|safe }}</label>
       {{ form.username }}
       {% if form.username.errors %}
@@ -106,7 +104,7 @@
       {% endif %}
     </div>
   </div>
-      <div class="required field">
+      <div class="required field{% if form.home_channel.errors %} error{% endif %}">
       <label for="{{ form.home_channel.id_for_label }}">{{ form.home_channel.label|safe }}</label>
       {{ form.home_channel }}
       {% if form.home_channel.errors %}
@@ -116,7 +114,7 @@
       {% endif %}
     </div>
   <div class="two fields">
-    <div class="required field">
+    <div class="required field{% if form.command_character.errors %} error{% endif %}">
       <label for="{{ form.command_character.id_for_label }}">{{ form.command_character.label|safe }}</label>
       {{ form.command_character }}
       {% if form.command_character.errors %}
@@ -125,7 +123,7 @@
         </div>
       {% endif %}
     </div>
-    <div class="required field">
+    <div class="required field{% if form.help_character.errors %} error{% endif %}">
       <label for="{{ form.help_character.id_for_label }}">{{ form.help_character.label|safe }}</label>
       {{ form.help_character }}
       {% if form.help_character.errors %}
@@ -135,7 +133,7 @@
       {% endif %}
     </div>
   </div>
-  <div class="ui inverted toggle checkbox">
+  <div class="ui inverted toggle checkbox{% if form.enabled.errors %} error{% endif %}">
     {{ form.enabled }}
     <label for="{{ form.enabled.id_for_label }}">{{ form.enabled.label|safe }}</label>
     {% if form.enabled.errors %}