Added events
This commit is contained in:
parent
9a48e3f724
commit
2c9bc11290
@ -41,6 +41,7 @@ INSTALLED_APPS = [
|
||||
'bootstrap_admin',
|
||||
'case_law',
|
||||
'charter_members.apps.CharterMembersConfig',
|
||||
'events',
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
|
@ -11,6 +11,7 @@ import main.views
|
||||
import case_law.views
|
||||
import charter_members.views
|
||||
import expert_witnesses.views
|
||||
import events.views
|
||||
import forum.views
|
||||
import newsletters.views
|
||||
import newsroom.views
|
||||
@ -39,6 +40,8 @@ urlpatterns = [
|
||||
url(r'^contact/', main.views.contact, name='contact'),
|
||||
url(r'^experts/(?P<id>\d+)', expert_witnesses.views.viewer, name='expert'),
|
||||
url(r'^experts/', expert_witnesses.views.browser, name='experts'),
|
||||
url(r'^events/register', events.views.register, name='register'),
|
||||
url(r'^events/', events.views.view, name='events'),
|
||||
url(r'^forum/post/(?P<post>\d*)', forum.views.viewPost, name='post'),
|
||||
url(r'^forum/(?P<thread>\d*)?', forum.views.view, name='forum'),
|
||||
url(r'^login/', main.views.login, name='login'),
|
||||
|
0
events/__init__.py
Normal file
0
events/__init__.py
Normal file
9
events/admin.py
Normal file
9
events/admin.py
Normal file
@ -0,0 +1,9 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from .models import Event
|
||||
|
||||
|
||||
@admin.register(Event)
|
||||
class EventAdmit(admin.ModelAdmin):
|
||||
fields = ['title', 'date', 'location', 'max_attendees', 'cost', 'description']
|
||||
list_display = ['title', 'date', 'location', 'max_attendees', 'cost']
|
5
events/apps.py
Normal file
5
events/apps.py
Normal file
@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class EventsConfig(AppConfig):
|
||||
name = 'events'
|
43
events/migrations/0001_initial.py
Normal file
43
events/migrations/0001_initial.py
Normal file
@ -0,0 +1,43 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.5 on 2018-02-27 00:36
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import tinymce.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Attendees',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('paid', models.BooleanField(default=False)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Event',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=255)),
|
||||
('date', models.DateField()),
|
||||
('location', models.CharField(max_length=255)),
|
||||
('description', tinymce.models.HTMLField()),
|
||||
('max_attendees', models.IntegerField(blank=True, null=True)),
|
||||
('cost', models.DecimalField(decimal_places=2, max_digits=6)),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='attendees',
|
||||
name='event',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='events.Event'),
|
||||
),
|
||||
]
|
20
events/migrations/0002_auto_20180226_1938.py
Normal file
20
events/migrations/0002_auto_20180226_1938.py
Normal file
@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.5 on 2018-02-27 00:38
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='date',
|
||||
field=models.DateTimeField(),
|
||||
),
|
||||
]
|
25
events/migrations/0003_auto_20180226_2000.py
Normal file
25
events/migrations/0003_auto_20180226_2000.py
Normal file
@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.5 on 2018-02-27 01:00
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0002_auto_20180226_1938'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='attendees',
|
||||
name='event',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='attendees',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='events.Attendees'),
|
||||
),
|
||||
]
|
24
events/migrations/0004_auto_20180226_2001.py
Normal file
24
events/migrations/0004_auto_20180226_2001.py
Normal file
@ -0,0 +1,24 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.5 on 2018-02-27 01:01
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0003_auto_20180226_2000'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='event',
|
||||
name='attendees',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='attendees',
|
||||
field=models.ManyToManyField(to='events.Attendees'),
|
||||
),
|
||||
]
|
25
events/migrations/0005_auto_20180226_2039.py
Normal file
25
events/migrations/0005_auto_20180226_2039.py
Normal file
@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.5 on 2018-02-27 01:39
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0004_auto_20180226_2001'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='cost',
|
||||
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=6),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='location',
|
||||
field=models.CharField(blank=True, max_length=255, null=True),
|
||||
),
|
||||
]
|
0
events/migrations/__init__.py
Normal file
0
events/migrations/__init__.py
Normal file
24
events/models.py
Normal file
24
events/models.py
Normal file
@ -0,0 +1,24 @@
|
||||
from django.db import models
|
||||
|
||||
from tinymce import HTMLField
|
||||
|
||||
|
||||
class Attendees(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
paid = models.BooleanField(default=False)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Event(models.Model):
|
||||
title = models.CharField(max_length=255)
|
||||
date = models.DateTimeField()
|
||||
location = models.CharField(max_length=255, null=True, blank=True)
|
||||
description = HTMLField()
|
||||
max_attendees = models.IntegerField(blank=True, null=True)
|
||||
cost = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)
|
||||
attendees = models.ManyToManyField(Attendees)
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
82
events/templates/events.html
Normal file
82
events/templates/events.html
Normal file
@ -0,0 +1,82 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block head %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.8.2/fullcalendar.js"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.8.2/fullcalendar.css" />
|
||||
|
||||
<script>
|
||||
function register(id) {
|
||||
$.ajax({
|
||||
url: '{% url 'register' %}',
|
||||
method: 'post',
|
||||
data: {id: id}
|
||||
}).done(function() {window.location += '?id=' + id})
|
||||
}
|
||||
|
||||
$(function() {
|
||||
$('[id^=details-]').hide();
|
||||
|
||||
if(window.location.search.indexOf('id=') != -1) {
|
||||
var id = new RegExp(/id=(\d+)/).exec(window.location);
|
||||
$('#details-' + id[1]).show();
|
||||
}
|
||||
|
||||
$('#calendar').fullCalendar({
|
||||
events: [
|
||||
{% for event in events %}
|
||||
{id: {{ event.id }}, title: '{{event.title}}', start: '{{event.date|date:'c'}}', backgroundColor: '#4ec8ff'},
|
||||
{% endfor %}
|
||||
],
|
||||
eventClick: function(calEvent) {
|
||||
$('[id^=details-]').hide();
|
||||
$('#details-' + calEvent.id).show();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="container-fluid bg-dark-primary">
|
||||
<div class="row p-3">
|
||||
<div class="col-8 bg-white p-3 rounded">
|
||||
<div id="calendar"></div>
|
||||
</div>
|
||||
<div class="col-4 pr-0">
|
||||
<div class="ml-3 rounded bg-white h-100 p-3" style="position:relative">
|
||||
{% for event in events %}
|
||||
<div id="details-{{ event.id }}" style="display:none">
|
||||
<h3>{% if event.attendees.all|length >= event.max_attendees %}<strong>(FULL)</strong>{% endif %} {{ event.title }}</h3>
|
||||
<h6 class="text-muted">{{ event.date }}</h6>
|
||||
<br>
|
||||
<h6><strong>Description:</strong></h6>
|
||||
<p>{{ event.description|safe }}</p>
|
||||
{% if event.location %}
|
||||
<h6><strong>Where:</strong> {{ event.location }}</h6>
|
||||
{% endif %}
|
||||
{% if event.cost %}
|
||||
<h6><strong>Cost: </strong> ${{ event.cost }}</h6>
|
||||
{% endif %}
|
||||
{% if event.attendees.all %}
|
||||
<h6><strong>Attendees ({{ event.attendees.all|length }}{% if event.max_attendees %}/{{ event.max_attendees }}{% endif %}):</strong></h6>
|
||||
{% for attendee in event.attendees.all %}
|
||||
{{attendee.name}},
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if request.user.is_authenticated %}
|
||||
{% if not event.max_attendees or event.attendees.all|length < event.max_attendees %}
|
||||
<div class="fixed-bottom p-3" style="position:absolute">
|
||||
<button class="btn btn-primary float-right" onclick="register({{ event.id }})">Register</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
3
events/tests.py
Normal file
3
events/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
18
events/views.py
Normal file
18
events/views.py
Normal file
@ -0,0 +1,18 @@
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import render
|
||||
|
||||
from .models import Attendees, Event
|
||||
|
||||
|
||||
def view(request):
|
||||
events = Event.objects.all()
|
||||
return render(request, 'events.html', {'events': events})
|
||||
|
||||
|
||||
def register(request):
|
||||
event = Event.objects.get(id=request.POST.get('id'))
|
||||
attendee = Attendees(name='{} {}'.format(request.user.first_name, request.user.last_name), paid=False)
|
||||
attendee.save()
|
||||
event.attendees.add(attendee)
|
||||
event.save()
|
||||
return JsonResponse({'success': True})
|
BIN
media/Newsletter/ubuntu.ico
Normal file
BIN
media/Newsletter/ubuntu.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
6
media/PressRelease/misc.xml
Normal file
6
media/PressRelease/misc.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6 (venv)" project-jdk-type="Python SDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
23
media/PressRelease/test.iml
Normal file
23
media/PressRelease/test.iml
Normal file
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="django" name="Django">
|
||||
<configuration>
|
||||
<option name="rootFolder" value="" />
|
||||
<option name="settingsModule" value="settings.py" />
|
||||
<option name="manageScript" value="manage.py" />
|
||||
<option name="environment" value="<map/>" />
|
||||
<option name="doNotUseTestRunner" value="false" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="TemplatesService">
|
||||
<option name="TEMPLATE_CONFIGURATION" value="Django" />
|
||||
</component>
|
||||
</module>
|
BIN
media/case_law/RELEASE_-_OACPL_Names_First_President.pdf
Normal file
BIN
media/case_law/RELEASE_-_OACPL_Names_First_President.pdf
Normal file
Binary file not shown.
BIN
media/case_law/RELEASE_-_OACPL_Names_First_President_CYYYpZm.pdf
Normal file
BIN
media/case_law/RELEASE_-_OACPL_Names_First_President_CYYYpZm.pdf
Normal file
Binary file not shown.
BIN
media/case_law/RELEASE_-_OACPL_Names_First_President_RoMIfD3.pdf
Normal file
BIN
media/case_law/RELEASE_-_OACPL_Names_First_President_RoMIfD3.pdf
Normal file
Binary file not shown.
0
oacpl.sqlite3
Normal file
0
oacpl.sqlite3
Normal file
@ -59,9 +59,10 @@
|
||||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">HOME</a>
|
||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||
<a class="dropdown-item" href="{% url 'home' %}">Front Page</a>
|
||||
<a class="dropdown-item" href="{% url 'events' %}">Events</a>
|
||||
<a class="dropdown-item" href="{% url 'members' %}">Members</a>
|
||||
<a class="dropdown-item" href="{% url 'newsletters' %}">Newsletters</a>
|
||||
<a class="dropdown-item" href="{% url 'newsroom' %}">Newsroom</a>
|
||||
<a class="dropdown-item" href="{% url 'members' %}">Members</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item text-dark-primary">
|
||||
|
Loading…
Reference in New Issue
Block a user