Move and rename a lot of stuff into kaehmy app

This commit is contained in:
Jan Tuomi
2018-01-26 01:15:35 +02:00
parent 06c2a2b9a6
commit f0ea3505e4
36 changed files with 640 additions and 439 deletions
+1 -8
View File
@@ -3,9 +3,7 @@
from django.contrib import admin
from webapp.models import Official, Role
from webapp.models import Feed, Tag, BaseFeed, Event, Registration
from webapp.models import KaehmyForm, KaehmyMessage, OhlhafvChallenge
from webapp.models import CustomKaehmyRole, PresetKaehmyRole
from webapp.models import TelegramChannel
from webapp.models import OhlhafvChallenge
from modeltranslation.admin import TranslationAdmin
from django.contrib.auth.models import Permission
# this is needed so that the models get registered for translation
@@ -19,9 +17,4 @@ admin.site.register(Event, TranslationAdmin)
admin.site.register(Registration, TranslationAdmin)
admin.site.register(Official)
admin.site.register(Role)
admin.site.register(KaehmyForm)
admin.site.register(KaehmyMessage)
admin.site.register(CustomKaehmyRole)
admin.site.register(PresetKaehmyRole, TranslationAdmin)
admin.site.register(TelegramChannel)
admin.site.register(OhlhafvChallenge)
+2 -88
View File
@@ -4,94 +4,8 @@ from django import forms
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError
from webapp.models import CustomKaehmyRole, PresetKaehmyRole, BaseRole
from webapp.models import OhlhafvChallenge, KaehmyForm, KaehmyMessage
class KaehmyCheckboxSelectMultiple(forms.widgets.CheckboxSelectMultiple):
option_template_name = 'checkbox_option.html'
def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
dic = super(KaehmyCheckboxSelectMultiple, self).create_option(name, value, label, selected, index, subindex, attrs)
description = PresetKaehmyRole.objects.get(id=value).description
dic['description'] = description
return dic
def __init__(self, *args, **kwargs):
super(KaehmyCheckboxSelectMultiple, self).__init__(*args, **kwargs)
class KaehmyForm_Form(forms.ModelForm):
"""Class representing Kaehmy form."""
class Meta:
"""Meta for class KaehmyForm."""
model = KaehmyForm
fields = ['name', 'email', 'phone_number', 'year',
'preset_roles', 'custom_roles', 'custom_role_name',
'custom_role_is_board', 'text']
def __init__(self, *args, **kwargs):
super(KaehmyForm_Form, self).__init__(*args, **kwargs)
self.fields["email"].label = _('Email (not public)')
self.fields["phone_number"].label = _('Phone number (not public)')
custom_roles_exist = CustomKaehmyRole.objects.all().exists()
self.fields["custom_roles"].widget = forms.widgets.CheckboxSelectMultiple() if custom_roles_exist else forms.HiddenInput()
self.fields["custom_roles"].help_text = ""
self.fields["custom_roles"].label = _('Custom roles')
self.fields["custom_roles"].queryset = CustomKaehmyRole.objects.all()
for cat_id, category in BaseRole.CATEGORIES:
key = 'preset_roles_{}'.format(cat_id)
qset = PresetKaehmyRole.objects.filter(category=cat_id).order_by('category', '-is_board')
self.fields[key] = forms.ModelMultipleChoiceField(qset)
self.fields[key].widget = KaehmyCheckboxSelectMultiple(attrs={
'title': _('Preset roles'),
'name': 'preset_roles',
})
self.fields[key].help_text = ""
self.fields[key].queryset = qset
self.fields[key].label = _(category)
self.fields[key].required = False
def clean(self):
cleaned_data = super(KaehmyForm_Form, self).clean()
print(cleaned_data)
for key in cleaned_data.keys():
if 'preset_roles_' in key:
cleaned_data['preset_roles'] = cleaned_data['preset_roles'] | cleaned_data[key]
print(cleaned_data)
return cleaned_data
def clean_phone_number(self):
"""Clean phone number field."""
number = self.cleaned_data.get('phone_number')
if number.isdigit():
return number
else:
raise ValidationError(_('Invalid phone number'))
def clean_custom_role_name(self):
"""Check that no other custom role with same name exists."""
custom_name = self.cleaned_data.get('custom_role_name')
if not CustomKaehmyRole.objects.filter(name=custom_name).exists():
return custom_name
else:
raise ValidationError(_('Custom role with the same name already exists.'))
def non_role_fields(self):
return [self.fields[k] for k in self.fields.keys() if k not in ["preset_roles", "custom_roles"]]
class KaehmyCommentForm(forms.ModelForm):
class Meta:
model = KaehmyMessage
fields = ['name', 'email', 'message', 'parent']
from webapp.models import BaseRole
from webapp.models import OhlhafvChallenge
class OhlhafvForm(forms.ModelForm):
@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-01-25 22:31
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('webapp', '0037_auto_20180125_2131'),
]
operations = [
migrations.DeleteModel(
name='TelegramChannel',
),
migrations.DeleteModel(
name='CustomKaehmyRole',
),
migrations.DeleteModel(
name='KaehmyForm',
),
migrations.DeleteModel(
name='KaehmyMessage',
),
migrations.DeleteModel(
name='MessageParent',
),
migrations.DeleteModel(
name='PresetKaehmyRole',
),
]
-129
View File
@@ -122,120 +122,6 @@ class PresetRole(BaseRole):
description = models.TextField(_('Description'))
class PresetKaehmyRole(PresetRole):
"""Model for kaehmy role."""
class Meta:
verbose_name = _('Preset kaehmy role')
verbose_name_plural = _('Preset kaehmy roles')
class CustomKaehmyRole(BaseRole):
"""Model representing a user-specified custom occupation."""
class Meta:
verbose_name = _('Custom kaehmy role')
verbose_name_plural = _('Custom kaehmy roles')
class MessageParent(models.Model):
name = models.CharField(_('Name'), max_length=255, default='')
email = models.EmailField(_('Email'), default='')
timestamp = models.DateTimeField(_('Timestamp'), default=timezone.now)
def __str__(self):
return 'Message parent #{}'.format(self.id)
class KaehmyMessage(MessageParent):
"""
Model representing a kaehmymessage.
Every message relates to certain kaehmyform or parent message.
"""
class Meta:
verbose_name = _('Kaehmykommentti')
verbose_name_plural = _('Kaehmykommentit')
message = models.TextField(_('Message'))
parent = models.ForeignKey('MessageParent', related_name='messages')
class KaehmyForm(MessageParent):
"""
Model representing a form for kaehmy.
Allows user to choose from existing roles or to create custom ones.
"""
YEAR_CHOICES = (
(1, '1'),
(2, '2'),
(3, '3'),
(4, '4'),
(5, 'N'),
)
class Meta:
verbose_name = _('Kaehmylomake')
verbose_name_plural = _('Kaehmylomakkeet')
phone_number = models.CharField(
_('Phone number'), max_length=10, default="")
year = models.IntegerField(_('Year'), choices=YEAR_CHOICES)
text = models.TextField(_('Text'), default="", max_length=300)
custom_role_name = models.CharField(
_('Custom role name'), max_length=255, blank=True)
custom_role_is_board = models.BooleanField(
_('Board member'), blank=True)
custom_roles = models.ManyToManyField(
'CustomKaehmyRole', related_name='forms', blank=True)
preset_roles = models.ManyToManyField(
'PresetKaehmyRole', related_name='forms', blank=True)
def __str__(self):
"""Return model info."""
return _('Kaehmy application: {}').format(self.name)
def comment_count(self):
"""Count comments for kaehmy."""
total = 0
def recurse(message):
count = 0
for msg in message.messages.all():
count += recurse(msg)
return count + 1
for message in self.messages.all():
total += recurse(message)
return total
def board_roles(self):
presets = [r.name.capitalize() for r in self.preset_roles.filter(is_board=True)]
customs = [r.name.capitalize() for r in self.custom_roles.filter(is_board=True)]
combined = presets + customs
return _('Board: {}').format(', '.join(combined)) if len(combined) > 0 else ''
def official_roles(self):
presets = [r.name.capitalize() for r in self.preset_roles.filter(is_board=False)]
customs = [r.name.capitalize() for r in self.custom_roles.filter(is_board=False)]
combined = presets + customs
return _('Official: {}').format(', '.join(combined)) if len(combined) > 0 else ''
def all_roles(self):
presets = [r.name.capitalize() for r in self.preset_roles.all()]
customs = [r.name.capitalize() for r in self.custom_roles.all()]
combined = presets + customs
return ', '.join(combined) if len(combined) > 0 else ''
def has_any_board_role(self):
return self.preset_roles.filter(is_board=True).exists() or self.custom_roles.filter(is_board=True)
class Role(PresetRole):
"""
Model for Role.
@@ -294,21 +180,6 @@ class OhlhafvChallenge(models.Model):
return _('Ohlhafv challenge: {} vs. {}').format(self.challenger, self.victim)
# Telegram channel entry for Kaehmys
class TelegramChannel(models.Model):
"""Model containing the channel id of a Telegram chat"""
class Meta:
verbose_name = _('Telegram channel')
verbose_name_plural = _('Telegram channels')
name = models.CharField(max_length=255)
channel_id = models.CharField(max_length=255, unique=True)
def __str__(self):
return 'Telegram channel: "{}"'.format(self.name)
auditlog.register(Tag)
auditlog.register(Feed)
auditlog.register(Event)
+1 -9
View File
@@ -2,17 +2,9 @@ import django_tables2 as tables
from django.db.models import Count, Q
from django.utils.translation import ugettext as _
from webapp.models import OhlhafvChallenge, KaehmyForm
from webapp.models import OhlhafvChallenge
class OhlhafvTable(tables.Table):
class Meta:
model = OhlhafvChallenge
class KaehmyExportTable(tables.Table):
class Meta:
model = KaehmyForm
exclude = ['text', 'messageparent_ptr', 'custom_role_name', 'custom_role_is_board', 'timestamp']
all_roles = tables.Column(verbose_name=_('Roles'), orderable=False)
-25
View File
@@ -1,25 +0,0 @@
{% extends "form_base.html" %}
{% load static %}
{% load i18n %}
{% block header %}
<div class="kaehmy_header">
{% include "kaehmy/header.html" %}
</div>
{% endblock header %}
{% block navigation %}
{% include "kaehmy/navigation.html" %}
{% endblock %}
<div class="kaehmy-content">
{% block content %}
{% endblock %}
</div>
<div class="footer">
{% block footer %}
{% include "kaehmy/footer.html" %}
{% endblock footer %}
</div>
@@ -1,5 +0,0 @@
{% if wrap_label %}
<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %}>{% endif %}
{% include "django/forms/widgets/input.html" %}
{% if wrap_label %} {{ widget.label }}</label>{% endif %}
<span class="fa fa-info-circle" data-toggle="tooltip" data-placement="right" title="{{ widget.description }}"></span>
-18
View File
@@ -1,18 +0,0 @@
{% extends "kaehmy/base.html" %}
{% load static %}
{% load i18n %}
{% block content %}
<div>
<div>
<h3>{% trans "Error" %}</h3>
</div>
<div class="alert alert-danger">
{{ error|safe }}
</div>
<div>
<button onclick="window.history.back();" class="btn btn-primary">{% trans "Back" %}</button>
</div>
</div>
{% endblock content %}
-26
View File
@@ -1,26 +0,0 @@
{% extends "kaehmy/base.html" %}
{% load static %}
{% load i18n %}
{% block content %}
<div>
<div>
<h2 style="padding-top: 1rem">{% trans "All applications" %}</h2>
</div>
<div>
<h4>{% trans "Board applications" %}</h4>
{{ board_table|safe }}
</div>
<div>
<h4>{% trans "Non-board applications" %}</h4>
{{ non_board_table|safe }}
</div>
<div>
<a href="/kaehmy" class="btn btn-primary">{% trans "Front page" %}</a>
</div>
</div>
{% endblock content %}
-25
View File
@@ -1,25 +0,0 @@
{% load i18n %}
{% load static %}
{% load staticfiles %}
<link rel="stylesheet" href="/static/css/kaehmy_footer.css">
<footer style="text-align: center">
<div>
<form class="lang-form form" action="{% url 'set_language' %}" method="post">{% csrf_token %}
<span>
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select onchange="this.form.submit()" class="lang-select form-control" name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
</span>
</form>
<span>{% trans "Copyright Aalto-yliopiston Sähköinsinöörikilta ry" %} {% now 'Y' %}</span>
</div>
</footer>
-8
View File
@@ -1,8 +0,0 @@
{% load i18n %}
<link rel="stylesheet" href="/static/css/kaehmy_header.css">
<div class="kaehmy_header-content">
<div class="kaehmy-banner logo">
<a href="/kaehmy"><img class="kaehmy-banner-image" src="/static/img/kaehmy_banner.png" alt="Aalto-yliopiston Sähköinsinöörikilta ry"></a>
</div>
</div>
-83
View File
@@ -1,83 +0,0 @@
{% extends "kaehmy/base.html" %}
{% load bootstrap3 %}
{% load i18n %}
{% block navigation %}
{% include "kaehmy/navigation.html" %}
{% endblock %}
{% block content %}
<div>
<h2 style="padding-top: 1rem">{% trans "Kaehmylomake" %}</h2>
<div id="input_form">
<p>
{% blocktrans %}Kaehmykoneella voit ilmaista kiinnostuksesi toimia killassa ensi vuonna.
Listassa on vastuualueittain sekä hallitus- että toimihenkilövirkoja.
Koska lista ei ole koskaan täydellinen, voit myös ehdottaa ihan uutta toimenkuvaa.
Jos sinulla on kysyttävää mistä tahansa virasta, kannattaa konsultoida <a href="/static/other/kahmyopas.pdf">kaehmyopasta</a>
tai olla yhteydessä kyseistä virkaa tänä vuonna toimittavaan henkilöön.{% endblocktrans %}
</p>
<p>
{% blocktrans %}Muista, että kaehmyn lähettäminen on kiinnostuksen ilmaus
eikä siis missään nimessä sitova ilmoittautumien mihinkään tehtävään!{% endblocktrans %}
</p>
<h5>{% trans "Päivämääriä & deadlineja" %}</h5>
<ul>
<li><strong>1.11.</strong> {% blocktrans %}Hallitustyrkkypaneeli (haku hallitukseen olisi hyvä tehdä ennen tätä!){% endblocktrans %}</li>
<li><strong>9.11.</strong> {% blocktrans %}Vaalikokous, osa 1 (puheenjohtajan valinta){% endblocktrans %}</li>
<li><strong>15.11.</strong> {% blocktrans %}Vaalikokous, osa 2 (hallituksen valinta){% endblocktrans %}</li>
<li><strong>20.11.</strong> {% blocktrans %}Kiltailta{% endblocktrans %}</li>
<li><strong>25.11.</strong> {% blocktrans %}Haku toimariksi olisi hyvä tehdä ennen tätä!{% endblocktrans %}</li>
<li><strong>30.11.</strong> {% blocktrans %}Vaalikokous, osa 3 (toimarien valinta){% endblocktrans %}</li>
</ul>
<form name="kaehmyForm" action="/kaehmy/submit/" method="post" class="form">{% csrf_token %}
{% bootstrap_field form.name %}
{% bootstrap_field form.email %}
{% bootstrap_field form.phone_number %}
{% bootstrap_field form.year %}
<h4>{% trans "Preset roles" %}</h4>
{% for preset_field in form %}
{% if "preset_roles_" in preset_field.name %}
<div class="card">
<div class="card-header">
{{ preset_field.label }}
</div>
<div class="card-block">
{% bootstrap_field preset_field show_label=False %}
</div>
</div>
{% endif %}
{% endfor %}
{% for custom_field in form %}
{% if custom_field.name == 'custom_roles' %}
<div class="card">
<div class="card-header">
{{ custom_field.label }}
</div>
<div class="card-block">
{% bootstrap_field custom_field show_label=False %}
</div>
</div>
{% endif %}
{% endfor %}
<div class="card">
<div class="card-block">
{% bootstrap_field form.custom_role_name %}
{% bootstrap_field form.custom_role_is_board %}
</div>
</div>
{% bootstrap_field form.text %}
{% buttons %}
<button type="submit" class="btn btn-primary">
{% trans "Submit" %}
</button>
{% endbuttons %}
</form>
</div>
</div>
{% endblock content %}
-108
View File
@@ -1,108 +0,0 @@
{% extends "kaehmy/base.html" %}
{% load static %}
{% load i18n %}
{% block navigation %}
{% include "kaehmy/navigation.html" %}
{% endblock %}
{% block content %}
<script>
function commentOn(id, op) {
setTimeout(function() {
document.getElementById("commentNameField").focus();
}, 50);
document.getElementById("collapse_add_comment").scrollIntoView();
document.getElementById("commentOP").innerHTML = op;
document.getElementById("commentId").value = id;
}
</script>
<div>
<div>
<h2 style="padding-top: 1rem">{% trans "All kaehmys" %}</h2>
</div>
<div class="collapse" id="collapse_add_comment">
<div class="card">
<div class="card-block">
<form method="POST" action="/kaehmy/add_comment" class="form">{% csrf_token %}
<div class="form-group">
{% trans "Commenting on post by " %} <span id="commentOP"></span>
<input type="hidden" name="parent" id="commentId">
</div>
<div class="form-group">
<label>{% trans "Name" %}</label>
<input id="commentNameField" name="name" type="text" class="form-control" placeholder="Teemu Teekkari">
</div>
<div class="form-group">
<label>{% trans "Email" %}</label>
<input name="email" type="email" class="form-control" placeholder="teemu@teekka.ri">
</div>
<div class="form-group">
<label>{% trans "Comment" %}</label>
<textarea name="message" class="form-control" rows=3 placeholder="Hei!"></textarea>
</div>
<div class="form-group">
<input type="submit" class="btn btn-primary" value={% trans "Send" %}>
</div>
</form>
</div>
</div>
</div>
<div>
<form class="role-filter-form form-inline" method="GET">
<label><strong>{% trans "Filter kaehmys" %}:</strong></label>
<select onchange="this.form.submit()" name="role" class="form-control">
<option value="-1">{% trans "All kaehmys" %}</option>
{% for option in filter_options %}
<option value={{ option.0 }} {% if request.GET.role|slugify == option.0|slugify %} selected="selected"{% endif %}>
{{ option.1 }} ({{ option.2 }})
</option>
{% endfor %}
</select>
</form>
</div>
<div>
<h6 style="padding-bottom: 1rem">{% trans "Total kaehmys:" %} {{ application_count }}</h6>
</div>
{% for application in applications %}
<div class="card">
<h4 class="card-header">{{ application.name }}</h4>
<div class="card-block">
{% if application.board_roles|length > 0 %}
<h5 style="padding-bottom: 1rem" class="card-subtitle mb-2 text-muted">{{ application.board_roles }}</h5>
{% endif %}
{% if application.official_roles|length > 0 %}
<h5 style="padding-bottom: 1rem" class="card-subtitle mb-2 text-muted">{{ application.official_roles }}</h5>
{% endif %}
<p class="card-text">{{ application.text|linebreaks|urlize }}</p>
{% if application.comment_count > 0 %}
<a type="button" style="cursor: pointer" data-toggle="collapse" data-target="#collapse_{{ application.id }}" aria-expanded="false" aria-controls="collapse_{{ application.id }}">
{% trans "Show comments" %} ({{ application.comment_count }})
</a>
{% endif %}
<div>
<a type="button" onclick="commentOn({{ application.id }}, '{{ application.name }}')" style="cursor: pointer" data-toggle="collapse" data-target="#collapse_add_comment" aria-expanded="false" aria-controls="collapse_add_comment">
{% trans "Add comment" %}
</a>
</div>
<div class="collapse" id="collapse_{{ application.id }}">
{% for message in application.messages.all %}
{% include "kaehmy/message.html" with messages=message.messages.all %}
{% endfor %}
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock content %}
-21
View File
@@ -1,21 +0,0 @@
{% load i18n %}
<div class="card" style="margin-top: 0.5rem; margin-bottom: 0">
<div class="card-block">
<h4>{{ message.name }}</h4>
<p>{{ message.message|linebreaks|urlize }}</p>
<h6 class="card-subtitle mb-2 text-muted">{{ message.timestamp }}</h6>
<div>
<a type="button" onclick="commentOn({{ message.id }}, '{{ message.name }}')" style="cursor: pointer" data-toggle="collapse" data-target="#collapse_add_comment" aria-expanded="false" aria-controls="collapse_add_comment">
{% trans "Reply" %}
</a>
</div>
<div>
{% for message in messages %}
{% include "kaehmy/message.html" with messages=message.messages.all %}
{% endfor %}
</div>
</div>
</div>
-12
View File
@@ -1,12 +0,0 @@
{% load i18n %}
<link rel="stylesheet" href="/static/css/kaehmy_nav.css">
<div class="kaehmy_navigation">
<nav class="navbar-border navbar navbar-toggleable-md navbar-light bg-faded">
<div class="navbar-nav">
<a class="nav-item nav-link" href="/kaehmy">{% trans "List kaehmys" %}</a>
<a class="nav-item nav-link" href="/kaehmy/new">{% trans "New kaehmy" %} <span class="sr-only">(current)</span></a>
<a class="nav-item nav-link" href="/kaehmy/statistics">{% trans "Statistics" %}</a>
</div>
</nav>
</div>
-30
View File
@@ -1,30 +0,0 @@
{% extends "kaehmy/base.html" %}
{% load bootstrap3 %}
{% load i18n %}
{% block navigation %}
{% include "kaehmy/navigation.html" %}
{% endblock %}
{% block content %}
<div>
<div>
<h2 style="padding-top: 1rem">{% trans "Statistics" %}</h2>
</div>
<div style="margin-top: 1rem" class="card">
<div class="card-header">
<h5>{% trans "Total kaehmys:" %} {{ application_count }}</h5>
</div>
<div class="card-block">
{% for role in role_list %}
<div>
<p>{{ role.0 }} <strong data-toggle="tooltip" data-placement="right" title="{{ role.2 }}">({{ role.1 }})</strong></p>
</div>
{% endfor %}
</div>
</div>
</div>
{% endblock content %}
+2 -2
View File
@@ -1,10 +1,10 @@
{% extends "ohlhafv/base.html" %}
{% extends ":base.html" %}
{% load bootstrap3 %}
{% load i18n %}
{% block navigation %}
{% include "ohlhafv/navigation.html" %}
{% include ":navigation.html" %}
{% endblock %}
{% block content %}
+1 -8
View File
@@ -2,7 +2,7 @@
from modeltranslation.translator import register, TranslationOptions
from webapp.models import BaseFeed, Feed, Tag, Event, Registration
from webapp.models import PresetRole, BaseRole, PresetKaehmyRole
from webapp.models import PresetRole, BaseRole
@register(BaseFeed)
@@ -52,10 +52,3 @@ class PresetRoleTranslationOptions(TranslationOptions):
"""Class for PresetRole translation options."""
fields = ('description',)
@register(PresetKaehmyRole)
class PresetKaehmyRoleTranslationOptions(TranslationOptions):
""" Class for PresetKaehmyRole translation options"""
fields = ()
-14
View File
@@ -17,12 +17,6 @@ from webapp.views import event_calendar_view
from webapp.views import international_view
from webapp.views import sosso_view
from webapp.views import contact_view
from webapp.views import kaehmy_view
from webapp.views import kaehmy_list_view
from webapp.views import kaehmy_submit
from webapp.views import kaehmy_comment
from webapp.views import kaehmy_statistics_view
from webapp.views import kaehmy_export_view
urlpatterns = [
# main
@@ -46,14 +40,6 @@ urlpatterns = [
# corporate
url(r'^jobs', jobs_view),
# kaehmy
url(r'^kaehmy/new', kaehmy_view),
url(r'^kaehmy/submit', kaehmy_submit),
url(r'^kaehmy/add_comment', kaehmy_comment),
url(r'^kaehmy/statistics', kaehmy_statistics_view),
url(r'^kaehmy/export', kaehmy_export_view),
url(r'^kaehmy', kaehmy_list_view),
# ohlhafv
url(r'^ohlhafv/submit', ohlhafv_submit),
url(r'^ohlhafv/list', ohlhafv_list),
+4 -163
View File
@@ -13,10 +13,9 @@ import logging
import requests
from dealer.git import git
from webapp.models import PresetKaehmyRole, CustomKaehmyRole, Official
from webapp.models import OhlhafvChallenge, KaehmyForm, TelegramChannel
from webapp.forms import OhlhafvForm, KaehmyForm_Form, KaehmyCommentForm
from webapp.tables import OhlhafvTable, KaehmyExportTable
from webapp.models import Official, OhlhafvChallenge
from webapp.forms import OhlhafvForm
from webapp.tables import OhlhafvTable
from members.views.utils import *
from django.core.mail import send_mail
@@ -171,162 +170,4 @@ def ohlhafv_list(request, *args, **kwargs):
'challenges': challenges,
'challenge_count': len(challenges),
}
return render(request, 'ohlhafv/list.html', context)
@ensure_csrf_cookie
@require_http_methods(["GET"])
def kaehmy_list_view(request, *args, **kwargs):
"""Kaehmy application list"""
role_filter = request.GET.get('role', None)
if role_filter is not None and str(role_filter) != '-1':
applications = KaehmyForm.objects.filter(custom_roles__id=role_filter) | KaehmyForm.objects.filter(preset_roles__id=role_filter)
else:
applications = KaehmyForm.objects.all()
applications = applications.order_by('-timestamp')
filter_options_preset = PresetKaehmyRole.objects.annotate(form_count=Count('forms')).filter(form_count__gt=0)
filter_options_preset_list = [(r.id, r.name, r.form_count) for r in filter_options_preset]
filter_options_custom = CustomKaehmyRole.objects.annotate(form_count=Count('forms')).filter(form_count__gt=0)
filter_options_custom_list = [(r.id, r.name, r.form_count) for r in filter_options_custom]
filter_options = filter_options_preset_list + filter_options_custom_list
filter_options.sort(key=lambda f: f[1])
context = {
'applications': applications,
'application_count': len(applications),
'filter_options': filter_options
}
return render(request, 'kaehmy/list.html', context)
@ensure_csrf_cookie
@require_http_methods(["POST"])
def kaehmy_comment(request, *args, **kwargs):
"""POST endpoint for commenting"""
form = KaehmyCommentForm(request.POST)
if form.is_valid():
comment = form.save()
email = comment.parent.email
name = comment.name
subject = 'Kaehmyysi tai kommenttiisi on vastattu!'
body = ('{} on vastannut kaehmyhakemukseesi tai kommenttiisi kaehmypalvelussa.\r\n\r\n'
'Käy lukemassa viesti osoitteessa http://sika.sahkoinsinoorikilta.fi/kaehmy').format(name.capitalize())
send_email(email, subject, body)
logging.debug(
'Sent kaehmy comment email to recipient <{}>'.format(email))
return redirect('/kaehmy')
else:
print(form)
context = {
'error': form.errors
}
return render(request, 'kaehmy/error.html', context)
@require_http_methods(["GET"])
def kaehmy_statistics_view(request, *args, **kwargs):
"""Kaehmys roles listed by applications"""
applications = KaehmyForm.objects.all()
role_list = []
preset_roles = PresetKaehmyRole.objects.all()
custom_roles = CustomKaehmyRole.objects.all()
for preset in preset_roles:
people = [form.name for form in preset.forms.all()]
role_list.append((preset.name, len(people), ', '.join(people)))
for custom in custom_roles:
people = [form.name for form in custom.forms.all()]
role_list.append((custom.name, len(people), ', '.join(people)))
context = {
'applications': applications,
'application_count': len(applications),
'role_list': role_list
}
return render(request, 'kaehmy/statistics.html', context)
@require_http_methods(["GET"])
def kaehmy_view(request, *args, **kwargs):
"""Render Kaehmy form page."""
form = KaehmyForm_Form()
return render(request, 'kaehmy/kaehmy.html', {'form': form})
@ensure_csrf_cookie
@require_http_methods(["POST"])
def kaehmy_submit(request, *args, **kwargs):
"""Submit Kaehmy form."""
form = KaehmyForm_Form(request.POST)
if form.is_valid():
application = form.save()
custom_name = form.cleaned_data.get('custom_role_name')
custom_is_board = form.cleaned_data.get('custom_role_is_board')
if len(custom_name) > 0:
custom_role = CustomKaehmyRole(
name=custom_name, is_board=custom_is_board)
custom_role.save()
application.custom_roles.add(custom_role)
url = 'https://sika.sahkoinsinoorikilta.fi/kaehmy'
email = form.cleaned_data.get('email', '')
name = form.cleaned_data.get('name', 'Anonymous')
subject = 'Arwokas kirjattu kirje mahdolliselle tulewalle kiltahenkilölle'
body = ('Moikka {}!\r\n\r\nHienoa, että kilta kiinnostaa! Kaehmysi on vastaanotettu.\r\n'
'Mahdollisista kommenteista tulee ilmoitus sähköpostitse.\r\n\r\n'
'Käy katsomassa kaehmytilanne osoitteessa {}').format(name, url)
send_email(email, subject, body)
logging.debug('Sent kaehmy email to recipient <{}>'.format(email))
CHAT_IDS = [channel.channel_id for channel in TelegramChannel.objects.all()]
for chat_id in CHAT_IDS:
tg_string = 'https://api.telegram.org/bot{}/sendMessage?chat_id={}&text={}'.format(
settings.TELEGRAM_BOT_TOKEN,
chat_id,
'Uusi kaehmy/New kaehmy! {} -> {}'.format(name, url)
)
response = requests.get(tg_string).json()
logging.debug('Telegram API response:\n{}'.format(response))
logging.debug('Sent kaehmy announcement to {} channels.'.format(len(CHAT_IDS)))
else:
context = {
'error': form.errors
}
return render(request, 'kaehmy/error.html', context)
return HttpResponseRedirect('/kaehmy')
@require_http_methods(['GET'])
def kaehmy_export_view(request, *args, **kwargs):
def make_table(queryset):
table = KaehmyExportTable(queryset,
request=request,
exclude=['id'],
attrs={'class': 'table table-bordered table-hover'})
table.paginate(page=request.GET.get('page', 1), per_page=9999)
table_html = convert_table_to_html(table, request)
return table_html
kaehmys = KaehmyForm.objects.all()
non_board = filter(lambda q: not q.has_any_board_role(), kaehmys)
board = filter(lambda q: q.has_any_board_role(), kaehmys)
context = {
'non_board_table': make_table(non_board),
'board_table': make_table(board),
}
return render(request, 'kaehmy/export.html', context)
return render(request, 'ohlhafv/list.html', context)