Merge branch 'develop' into 'master'
Develop Closes #71 and #72 See merge request !37
This commit is contained in:
+49
-12
@@ -1,20 +1,18 @@
|
||||
image: python:3.5
|
||||
|
||||
services:
|
||||
- postgres:latest
|
||||
|
||||
variables:
|
||||
POSTGRES_DB: ci
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
|
||||
stages:
|
||||
- test
|
||||
- lint
|
||||
- publish
|
||||
- deploy
|
||||
|
||||
test:
|
||||
image: python:3.5
|
||||
stage: test
|
||||
services:
|
||||
- postgres:latest
|
||||
variables:
|
||||
POSTGRES_DB: ci
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/$POSTGRES_DB"
|
||||
script:
|
||||
- python -V
|
||||
@@ -26,6 +24,7 @@ test:
|
||||
- python manage.py test
|
||||
|
||||
pep8:
|
||||
image: python:3.5
|
||||
stage: lint
|
||||
script:
|
||||
- pip install pep8
|
||||
@@ -34,6 +33,44 @@ pep8:
|
||||
eslint:
|
||||
image: node:7.10.0
|
||||
stage: lint
|
||||
before_script:
|
||||
- npm install
|
||||
script:
|
||||
- npm install -g eslint
|
||||
- eslint .
|
||||
- npm run eslint
|
||||
|
||||
remark:
|
||||
image: node:7.10.0
|
||||
stage: lint
|
||||
before_script:
|
||||
- npm install
|
||||
script:
|
||||
- npm run remark
|
||||
|
||||
publish:
|
||||
stage: publish
|
||||
image: docker:latest
|
||||
only:
|
||||
- develop
|
||||
before_script:
|
||||
- docker info
|
||||
script:
|
||||
- docker build . -t "$IMAGE_NAME"
|
||||
- docker push "$IMAGE_NAME"
|
||||
|
||||
deploy:
|
||||
stage: deploy
|
||||
image: alpine:latest
|
||||
environment:
|
||||
name: dev
|
||||
url: http://web.sik.party
|
||||
before_script:
|
||||
- pwd
|
||||
- apk add --update openssh
|
||||
- ssh -V
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
|
||||
- chmod 600 ~/.ssh/id_rsa
|
||||
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
|
||||
script:
|
||||
- scp docker-compose.yml $SSH_USER@$SSH_HOST:~/deployment/docker-compose.yml
|
||||
- ssh $SSH_USER@$SSH_HOST "cd deployment && docker-compose down && docker pull \"$IMAGE_NAME\" && docker-compose up -d && docker image prune -f"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
global_static
|
||||
@@ -0,0 +1,8 @@
|
||||
FROM python:3
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
ENV IS_DOCKER 1
|
||||
RUN mkdir /code
|
||||
WORKDIR /code
|
||||
ADD requirements.txt /code/
|
||||
RUN env
|
||||
ADD . /code/
|
||||
@@ -0,0 +1,13 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
db:
|
||||
image: postgres
|
||||
web:
|
||||
build: .
|
||||
image: 86.50.143.82:5000/web20
|
||||
command: ["bash", "-c", "cd /code && ./wait-for-it.sh db:5432 -- bash setup.sh --no-input --no-npm && python manage.py runserver 0.0.0.0:8080"]
|
||||
ports:
|
||||
- "8080:8080"
|
||||
depends_on:
|
||||
- db
|
||||
@@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-09-13 15:41
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('infoscreen', '0004_videoinfoitem'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='externalimageinfoitem',
|
||||
name='url',
|
||||
field=models.URLField(),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='externalwebsiteinfoitem',
|
||||
name='url',
|
||||
field=models.URLField(),
|
||||
),
|
||||
]
|
||||
@@ -97,7 +97,7 @@ class ApyInfoItem(InfoItem):
|
||||
|
||||
class ExternalWebsiteInfoItem(InfoItem):
|
||||
display_name = _("External website")
|
||||
url = models.TextField()
|
||||
url = models.URLField()
|
||||
|
||||
def get_template_url(self):
|
||||
return "/static/html/external_website.html?url={}".format(self.name)
|
||||
@@ -213,7 +213,7 @@ class HslInfoItem(InfoItem):
|
||||
|
||||
class ExternalImageInfoItem(InfoItem):
|
||||
display_name = _("External image")
|
||||
url = models.TextField()
|
||||
url = models.URLField()
|
||||
|
||||
def get_template_url(self):
|
||||
return "/static/html/generic_image.html?img={}".format(self.name)
|
||||
|
||||
Binary file not shown.
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-06-01 19:20+0300\n"
|
||||
"POT-Creation-Date: 2017-06-07 18:22+0300\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -70,72 +70,78 @@ msgstr "Manage Rotations"
|
||||
msgid "Create/Delete"
|
||||
msgstr "Create/Delete"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:48
|
||||
#: infoscreen/templates/infoscreen_admin.html:43
|
||||
#: infoscreen/templates/infoscreen_admin.html:152
|
||||
#: members/templates/members_base.html:75 members/templates/settings.html:11
|
||||
msgid "Settings"
|
||||
msgstr "Settings"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:49
|
||||
msgid "Create new item"
|
||||
msgstr "Create new item"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:49
|
||||
#: infoscreen/templates/infoscreen_admin.html:50
|
||||
#, fuzzy
|
||||
#| msgid "Create new item"
|
||||
msgid "Create a new item by type"
|
||||
msgstr "Create new item"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:52
|
||||
#: infoscreen/templates/infoscreen_admin.html:53
|
||||
msgid "Item type"
|
||||
msgstr "Item type"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:63
|
||||
#: infoscreen/templates/infoscreen_admin.html:83
|
||||
#: infoscreen/templates/infoscreen_admin.html:64
|
||||
#: infoscreen/templates/infoscreen_admin.html:84
|
||||
msgid "Info items"
|
||||
msgstr "Info items"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:64
|
||||
#: infoscreen/templates/infoscreen_admin.html:84
|
||||
#: infoscreen/templates/infoscreen_admin.html:65
|
||||
#: infoscreen/templates/infoscreen_admin.html:85
|
||||
msgid "Infoitems available for rotations"
|
||||
msgstr "Infoitems available for rotations"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:67
|
||||
#: infoscreen/templates/infoscreen_admin.html:87
|
||||
#: infoscreen/templates/infoscreen_admin.html:68
|
||||
#: infoscreen/templates/infoscreen_admin.html:88
|
||||
msgid "Item"
|
||||
msgstr "Item"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:68
|
||||
#: infoscreen/templates/infoscreen_admin.html:88
|
||||
#: infoscreen/templates/infoscreen_admin.html:69
|
||||
#: infoscreen/templates/infoscreen_admin.html:89
|
||||
msgid "Type"
|
||||
msgstr "Type"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:69
|
||||
#: infoscreen/templates/infoscreen_admin.html:74
|
||||
#: infoscreen/templates/infoscreen_admin.html:91
|
||||
#: infoscreen/templates/infoscreen_admin.html:98
|
||||
#: infoscreen/templates/infoscreen_admin.html:70
|
||||
#: infoscreen/templates/infoscreen_admin.html:75
|
||||
#: infoscreen/templates/infoscreen_admin.html:92
|
||||
#: infoscreen/templates/infoscreen_admin.html:99
|
||||
#: infoscreen/templates/infoscreen_admin.html:112
|
||||
#: infoscreen/templates/infoscreen_admin.html:116
|
||||
#: infoscreen/templates/infoscreen_admin.html:134
|
||||
#: infoscreen/templates/infoscreen_admin.html:140
|
||||
#: infoscreen/templates/infoscreen_admin.html:132
|
||||
#: infoscreen/templates/infoscreen_admin.html:138
|
||||
#: members/templates/member_edit.html:20 members/templates/payment_edit.html:20
|
||||
msgid "Delete"
|
||||
msgstr "Delete"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:89
|
||||
#: infoscreen/templates/infoscreen_admin.html:90
|
||||
msgid "Set duration"
|
||||
msgstr "Set duration"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:90
|
||||
#: infoscreen/templates/infoscreen_admin.html:91
|
||||
msgid "Add to rotation"
|
||||
msgstr "Add to rotation"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:97
|
||||
#: infoscreen/templates/infoscreen_admin.html:98
|
||||
msgid "Add"
|
||||
msgstr "Add"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:106
|
||||
#: infoscreen/templates/infoscreen_admin.html:131
|
||||
#: infoscreen/templates/infoscreen_admin.html:129
|
||||
msgid "Rotation"
|
||||
msgstr "Rotation"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:106
|
||||
#: infoscreen/templates/infoscreen_admin.html:133
|
||||
#: infoscreen/templates/infoscreen_admin.html:139
|
||||
#: infoscreen/templates/infoscreen_admin.html:131
|
||||
#: infoscreen/templates/infoscreen_admin.html:137
|
||||
msgid "Preview"
|
||||
msgstr "Preview"
|
||||
|
||||
@@ -151,26 +157,54 @@ msgstr "Instance"
|
||||
msgid "Duration"
|
||||
msgstr "Duration"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:125
|
||||
#: infoscreen/templates/infoscreen_admin.html:123
|
||||
msgid "Rotations"
|
||||
msgstr "Rotations"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:127
|
||||
#: infoscreen/templates/infoscreen_admin.html:125
|
||||
msgid "Select rotation to edit"
|
||||
msgstr "Select rotation to edit"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:132
|
||||
#: infoscreen/templates/infoscreen_admin.html:130
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:143
|
||||
#: infoscreen/templates/infoscreen_admin.html:141 webapp/models.py:46
|
||||
msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:144
|
||||
#: infoscreen/templates/infoscreen_admin.html:142
|
||||
msgid "Create new"
|
||||
msgstr "Create new"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:157
|
||||
#: members/templates/settings.html:17
|
||||
msgid "Language"
|
||||
msgstr "Language"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:161
|
||||
#: members/templates/settings.html:20 sikweb/settings-sample.py:179
|
||||
#: sikweb/settings.py:178
|
||||
msgid "Finnish"
|
||||
msgstr "Finnish"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:162
|
||||
#: members/templates/settings.html:21 sikweb/settings-sample.py:178
|
||||
#: sikweb/settings.py:177
|
||||
msgid "English"
|
||||
msgstr "English"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:166
|
||||
#: members/templates/settings.html:23
|
||||
#, fuzzy
|
||||
#| msgid "Submitted"
|
||||
msgid "Submit"
|
||||
msgstr "Submitted"
|
||||
|
||||
#: members/forms.py:20 members/tables.py:24
|
||||
msgid "Member"
|
||||
msgstr "Member"
|
||||
|
||||
#: members/models.py:16
|
||||
msgid "First name"
|
||||
msgstr "First name"
|
||||
@@ -231,10 +265,6 @@ msgstr "Edit"
|
||||
msgid "Options"
|
||||
msgstr "Options"
|
||||
|
||||
#: members/tables.py:24
|
||||
msgid "Member"
|
||||
msgstr "Member"
|
||||
|
||||
#: members/templates/application_edit.html:9
|
||||
msgid "Edit application"
|
||||
msgstr "Edit application"
|
||||
@@ -399,10 +429,6 @@ msgstr "List applications"
|
||||
msgid "Application form"
|
||||
msgstr "Application form"
|
||||
|
||||
#: members/templates/members_base.html:75 members/templates/settings.html:11
|
||||
msgid "Settings"
|
||||
msgstr "Settings"
|
||||
|
||||
#: members/templates/payment_delete_confirm.html:9
|
||||
msgid "Are you sure you want to delete this payment?"
|
||||
msgstr "Are you sure you want to delete this payment?"
|
||||
@@ -415,20 +441,6 @@ msgstr "Edit payment"
|
||||
msgid "Payment events"
|
||||
msgstr "Payment events"
|
||||
|
||||
#: members/templates/settings.html:17
|
||||
msgid "Language"
|
||||
msgstr "Language"
|
||||
|
||||
#: members/templates/settings.html:20 sikweb/settings-sample.py:179
|
||||
#: sikweb/settings.py:177
|
||||
msgid "Finnish"
|
||||
msgstr "Finnish"
|
||||
|
||||
#: members/templates/settings.html:21 sikweb/settings-sample.py:178
|
||||
#: sikweb/settings.py:176
|
||||
msgid "English"
|
||||
msgstr "English"
|
||||
|
||||
#: members/views.py:129 members/views.py:186 members/views.py:205
|
||||
msgid "No member id specified"
|
||||
msgstr "No member id specified"
|
||||
@@ -519,6 +531,34 @@ msgstr "Successfully deleted member"
|
||||
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||
|
||||
#: webapp/models.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Add member"
|
||||
msgid "Board member"
|
||||
msgstr "Add member"
|
||||
|
||||
#: webapp/models.py:54
|
||||
#, fuzzy
|
||||
#| msgid "Duration"
|
||||
msgid "Description"
|
||||
msgstr "Duration"
|
||||
|
||||
#: webapp/models.py:55
|
||||
msgid "Summary"
|
||||
msgstr ""
|
||||
|
||||
#: webapp/models.py:70
|
||||
msgid "Start date"
|
||||
msgstr ""
|
||||
|
||||
#: webapp/models.py:71
|
||||
msgid "End date"
|
||||
msgstr ""
|
||||
|
||||
#: webapp/models.py:79
|
||||
msgid "Phone number"
|
||||
msgstr ""
|
||||
|
||||
#: webapp/templates/admin_index.html:6
|
||||
msgid "SIK Admin"
|
||||
msgstr "SIK Admin"
|
||||
|
||||
Binary file not shown.
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-06-01 19:20+0300\n"
|
||||
"POT-Creation-Date: 2017-06-07 18:22+0300\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -71,70 +71,76 @@ msgstr "Hallinnoi Rotaatioita"
|
||||
msgid "Create/Delete"
|
||||
msgstr "Lisää/Poista"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:48
|
||||
#: infoscreen/templates/infoscreen_admin.html:43
|
||||
#: infoscreen/templates/infoscreen_admin.html:152
|
||||
#: members/templates/members_base.html:75 members/templates/settings.html:11
|
||||
msgid "Settings"
|
||||
msgstr "Asetukset"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:49
|
||||
msgid "Create new item"
|
||||
msgstr "Luo uusi dia"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:49
|
||||
#: infoscreen/templates/infoscreen_admin.html:50
|
||||
msgid "Create a new item by type"
|
||||
msgstr "Luo uusi dia tyypin perusteella"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:52
|
||||
#: infoscreen/templates/infoscreen_admin.html:53
|
||||
msgid "Item type"
|
||||
msgstr "Diatyyppi"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:63
|
||||
#: infoscreen/templates/infoscreen_admin.html:83
|
||||
#: infoscreen/templates/infoscreen_admin.html:64
|
||||
#: infoscreen/templates/infoscreen_admin.html:84
|
||||
msgid "Info items"
|
||||
msgstr "Diat"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:64
|
||||
#: infoscreen/templates/infoscreen_admin.html:84
|
||||
#: infoscreen/templates/infoscreen_admin.html:65
|
||||
#: infoscreen/templates/infoscreen_admin.html:85
|
||||
msgid "Infoitems available for rotations"
|
||||
msgstr "Rotaatioon lisättävät diat"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:67
|
||||
#: infoscreen/templates/infoscreen_admin.html:87
|
||||
#: infoscreen/templates/infoscreen_admin.html:68
|
||||
#: infoscreen/templates/infoscreen_admin.html:88
|
||||
msgid "Item"
|
||||
msgstr "Dia"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:68
|
||||
#: infoscreen/templates/infoscreen_admin.html:88
|
||||
#: infoscreen/templates/infoscreen_admin.html:69
|
||||
#: infoscreen/templates/infoscreen_admin.html:89
|
||||
msgid "Type"
|
||||
msgstr "Tyyppi"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:69
|
||||
#: infoscreen/templates/infoscreen_admin.html:74
|
||||
#: infoscreen/templates/infoscreen_admin.html:91
|
||||
#: infoscreen/templates/infoscreen_admin.html:98
|
||||
#: infoscreen/templates/infoscreen_admin.html:70
|
||||
#: infoscreen/templates/infoscreen_admin.html:75
|
||||
#: infoscreen/templates/infoscreen_admin.html:92
|
||||
#: infoscreen/templates/infoscreen_admin.html:99
|
||||
#: infoscreen/templates/infoscreen_admin.html:112
|
||||
#: infoscreen/templates/infoscreen_admin.html:116
|
||||
#: infoscreen/templates/infoscreen_admin.html:134
|
||||
#: infoscreen/templates/infoscreen_admin.html:140
|
||||
#: infoscreen/templates/infoscreen_admin.html:132
|
||||
#: infoscreen/templates/infoscreen_admin.html:138
|
||||
#: members/templates/member_edit.html:20 members/templates/payment_edit.html:20
|
||||
msgid "Delete"
|
||||
msgstr "Poista"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:89
|
||||
#: infoscreen/templates/infoscreen_admin.html:90
|
||||
msgid "Set duration"
|
||||
msgstr "Aseta kesto"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:90
|
||||
#: infoscreen/templates/infoscreen_admin.html:91
|
||||
msgid "Add to rotation"
|
||||
msgstr "Lisää rotaatioon"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:97
|
||||
#: infoscreen/templates/infoscreen_admin.html:98
|
||||
msgid "Add"
|
||||
msgstr "Lisää"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:106
|
||||
#: infoscreen/templates/infoscreen_admin.html:131
|
||||
#: infoscreen/templates/infoscreen_admin.html:129
|
||||
msgid "Rotation"
|
||||
msgstr "Rotaatio"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:106
|
||||
#: infoscreen/templates/infoscreen_admin.html:133
|
||||
#: infoscreen/templates/infoscreen_admin.html:139
|
||||
#: infoscreen/templates/infoscreen_admin.html:131
|
||||
#: infoscreen/templates/infoscreen_admin.html:137
|
||||
msgid "Preview"
|
||||
msgstr "Esikatsele"
|
||||
|
||||
@@ -150,26 +156,52 @@ msgstr "Dia"
|
||||
msgid "Duration"
|
||||
msgstr "Kesto"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:125
|
||||
#: infoscreen/templates/infoscreen_admin.html:123
|
||||
msgid "Rotations"
|
||||
msgstr "Rotaatiot"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:127
|
||||
#: infoscreen/templates/infoscreen_admin.html:125
|
||||
msgid "Select rotation to edit"
|
||||
msgstr "Valitse muokattava rotaatio"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:132
|
||||
#: infoscreen/templates/infoscreen_admin.html:130
|
||||
msgid "id"
|
||||
msgstr "id"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:143
|
||||
#: infoscreen/templates/infoscreen_admin.html:141 webapp/models.py:46
|
||||
msgid "Name"
|
||||
msgstr "Nimi"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:144
|
||||
#: infoscreen/templates/infoscreen_admin.html:142
|
||||
msgid "Create new"
|
||||
msgstr "Luo uusi"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:157
|
||||
#: members/templates/settings.html:17
|
||||
msgid "Language"
|
||||
msgstr "Kieli"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:161
|
||||
#: members/templates/settings.html:20 sikweb/settings-sample.py:179
|
||||
#: sikweb/settings.py:178
|
||||
msgid "Finnish"
|
||||
msgstr "suomi"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:162
|
||||
#: members/templates/settings.html:21 sikweb/settings-sample.py:178
|
||||
#: sikweb/settings.py:177
|
||||
msgid "English"
|
||||
msgstr "englanti"
|
||||
|
||||
#: infoscreen/templates/infoscreen_admin.html:166
|
||||
#: members/templates/settings.html:23
|
||||
msgid "Submit"
|
||||
msgstr "Lisää"
|
||||
|
||||
#: members/forms.py:20 members/tables.py:24
|
||||
msgid "Member"
|
||||
msgstr "Jäsen"
|
||||
|
||||
#: members/models.py:16
|
||||
msgid "First name"
|
||||
msgstr "Etunimi"
|
||||
@@ -230,10 +262,6 @@ msgstr "Muokkaa"
|
||||
msgid "Options"
|
||||
msgstr "Asetukset"
|
||||
|
||||
#: members/tables.py:24
|
||||
msgid "Member"
|
||||
msgstr "Jäsen"
|
||||
|
||||
#: members/templates/application_edit.html:9
|
||||
msgid "Edit application"
|
||||
msgstr "Muokkaa hakemusta"
|
||||
@@ -403,10 +431,6 @@ msgstr "Hakemuslistaus"
|
||||
msgid "Application form"
|
||||
msgstr "Jäsenhakemuslomake"
|
||||
|
||||
#: members/templates/members_base.html:75 members/templates/settings.html:11
|
||||
msgid "Settings"
|
||||
msgstr "Asetukset"
|
||||
|
||||
#: members/templates/payment_delete_confirm.html:9
|
||||
msgid "Are you sure you want to delete this payment?"
|
||||
msgstr "Oletko varma, että haluat poistaa tämän maksutapahtuman?"
|
||||
@@ -419,20 +443,6 @@ msgstr "Muokkaa maksua"
|
||||
msgid "Payment events"
|
||||
msgstr "Maksutapahtumat"
|
||||
|
||||
#: members/templates/settings.html:17
|
||||
msgid "Language"
|
||||
msgstr "Kieli"
|
||||
|
||||
#: members/templates/settings.html:20 sikweb/settings-sample.py:179
|
||||
#: sikweb/settings.py:177
|
||||
msgid "Finnish"
|
||||
msgstr "suomi"
|
||||
|
||||
#: members/templates/settings.html:21 sikweb/settings-sample.py:178
|
||||
#: sikweb/settings.py:176
|
||||
msgid "English"
|
||||
msgstr "englanti"
|
||||
|
||||
#: members/views.py:129 members/views.py:186 members/views.py:205
|
||||
msgid "No member id specified"
|
||||
msgstr "Jäsenen ID ei määritelty"
|
||||
@@ -521,6 +531,30 @@ msgstr "Kaikki jäsenkonfliktit ratkaistu onnistuneesti."
|
||||
msgid "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||
msgstr "Copyright Aalto-yliopiston Sähköinsinöörikilta ry"
|
||||
|
||||
#: webapp/models.py:47
|
||||
msgid "Board member"
|
||||
msgstr "Hallituksen jäsen"
|
||||
|
||||
#: webapp/models.py:54
|
||||
msgid "Description"
|
||||
msgstr "Kuvaus"
|
||||
|
||||
#: webapp/models.py:55
|
||||
msgid "Summary"
|
||||
msgstr "Tiivistelmä"
|
||||
|
||||
#: webapp/models.py:70
|
||||
msgid "Start date"
|
||||
msgstr "Alkupäivämäärä"
|
||||
|
||||
#: webapp/models.py:71
|
||||
msgid "End date"
|
||||
msgstr "Loppupäivämäärä"
|
||||
|
||||
#: webapp/models.py:79
|
||||
msgid "Phone number"
|
||||
msgstr "Puhelinnumero"
|
||||
|
||||
#: webapp/templates/admin_index.html:6
|
||||
msgid "SIK Admin"
|
||||
msgstr "SIK Hallintapaneeli"
|
||||
@@ -564,6 +598,3 @@ msgstr "Sössö"
|
||||
#: webapp/templates/navigation.html:32
|
||||
msgid "Contact"
|
||||
msgstr "Yhteystiedot"
|
||||
|
||||
#~ msgid "Select"
|
||||
#~ msgstr "Valitse"
|
||||
|
||||
@@ -6,3 +6,5 @@ admin.site.register(Member)
|
||||
admin.site.register(Request)
|
||||
admin.site.register(Payment)
|
||||
admin.site.register(MemberConflict)
|
||||
|
||||
admin.site.site_header = 'SIK Admin'
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from members.models import Member, Payment, Request
|
||||
|
||||
@@ -15,6 +16,9 @@ class PaymentForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Payment
|
||||
fields = ['date', 'source', 'member']
|
||||
labels = {
|
||||
'member': _('Member')
|
||||
}
|
||||
|
||||
|
||||
class ApplicationForm(forms.ModelForm):
|
||||
|
||||
+9
-2
@@ -3,7 +3,9 @@
|
||||
"version": "1.0.0",
|
||||
"description": "A modern web app using a Django backend and an Angular frontend.",
|
||||
"scripts": {
|
||||
"test": "eslint ."
|
||||
"test": "eslint . && remark .",
|
||||
"eslint": "eslint .",
|
||||
"remark": "remark ."
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -12,6 +14,11 @@
|
||||
"author": "SIK ry",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"eslint": "3.19.0"
|
||||
"eslint": "3.19.0",
|
||||
"remark-cli": "^4.0.0",
|
||||
"remark-preset-lint-recommended": "^3.0.1"
|
||||
},
|
||||
"remarkConfig": {
|
||||
"plugins": ["remark-preset-lint-recommended"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,11 +32,11 @@ git checkout develop
|
||||
|
||||
### Dependency list
|
||||
|
||||
* Python >3.5
|
||||
* PostgreSQL >9.5
|
||||
* pip3
|
||||
* virtualenv
|
||||
* npm
|
||||
* Python >3.5
|
||||
* PostgreSQL >9.5
|
||||
* pip3
|
||||
* virtualenv
|
||||
* npm
|
||||
|
||||
Install with apt:
|
||||
```
|
||||
@@ -48,14 +48,14 @@ sudo apt install npm
|
||||
```
|
||||
|
||||
More info about PostgreSQL at:
|
||||
https://www.postgresql.org/
|
||||
[https://www.postgresql.org/](https://www.postgresql.org)
|
||||
|
||||
These packages might be needed on certain platforms:
|
||||
|
||||
* python3-dev
|
||||
* libffi-dev
|
||||
* python3-cffi
|
||||
* libssl-dev
|
||||
* python3-dev
|
||||
* libffi-dev
|
||||
* python3-cffi
|
||||
* libssl-dev
|
||||
|
||||
## Create a virtual environment for python
|
||||
|
||||
@@ -94,7 +94,17 @@ Using address 0.0.0.0 will bind to all IP addresses.
|
||||
|
||||
### Visit the page
|
||||
|
||||
Visit https://localhost:8000 in your browser!
|
||||
Visit [https://localhost:8000](https://localhost:8000) in your browser!
|
||||
|
||||
## Running in production
|
||||
|
||||
A good way to run django in production is by using uWSGI. Install uWSGI with:
|
||||
|
||||
```
|
||||
pip install -r requirements.production.txt
|
||||
```
|
||||
|
||||
Create an uWSGI ini file and run the daemon according to online instructions.
|
||||
|
||||
## Development workflow
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uWSGI==2.0.14
|
||||
+3
-1
@@ -17,9 +17,11 @@ djangorestframework==3.5.3
|
||||
coverage==4.3.4
|
||||
django-nose==1.4.4
|
||||
nose-exclude==0.5.0
|
||||
uWSGI==2.0.14
|
||||
psycopg2==2.7.1
|
||||
django-bootstrap3==8.2.3
|
||||
django-tables2==1.6.1
|
||||
pep8==1.7.0
|
||||
dealer==2.0.5
|
||||
django-modeltranslation==0.12.1
|
||||
django-auditlog==0.4.3
|
||||
django-phonenumber-field==1.3.0
|
||||
|
||||
@@ -5,7 +5,20 @@ echo "This script will set up the environment for this project."
|
||||
echo "========================================================="
|
||||
echo "Dependencies: postgresql>9.5, python>3.5"
|
||||
|
||||
read -p "Are these programs installed? [y/n]" -n 1 -r
|
||||
INTERACTIVE="true"
|
||||
USE_NPM="true"
|
||||
if [[ $* == *--no-input* ]]
|
||||
then
|
||||
INTERACTIVE="false"
|
||||
fi
|
||||
if [[ $* == *--no-npm* ]]
|
||||
then
|
||||
USE_NPM="false"
|
||||
fi
|
||||
|
||||
$INTERACTIVE || echo "Running in non-interactive mode." && env
|
||||
|
||||
$INTERACTIVE && read -p "Are these programs installed? [y/n]" -n 1 -r || REPLY="y"
|
||||
echo ""
|
||||
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]
|
||||
@@ -14,7 +27,7 @@ then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
read -p "Create user 'sik' in postgres (needs sudo) [y/n]?" -n 1 -r
|
||||
$INTERACTIVE && read -p "Create user 'sik' in postgres (needs sudo) [y/n]?" -n 1 -r || REPLY="n"
|
||||
echo ""
|
||||
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]
|
||||
@@ -22,7 +35,7 @@ then
|
||||
sudo -u postgres psql < "$PWD/scripts/db/init.sql"
|
||||
fi
|
||||
|
||||
read -p "Is virtualenv activated? [y/n]" -n 1 -r
|
||||
$INTERACTIVE && read -p "Is virtualenv activated? [y/n]" -n 1 -r || REPLY="y"
|
||||
echo ""
|
||||
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]
|
||||
@@ -31,7 +44,7 @@ then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
read -p "Copy settings from template? [y/n]" -n 1 -r
|
||||
$INTERACTIVE && read -p "Copy settings from template? [y/n]" -n 1 -r || REPLY="y"
|
||||
echo ""
|
||||
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]
|
||||
@@ -40,7 +53,7 @@ then
|
||||
fi
|
||||
|
||||
|
||||
read -p "Start setup? [y/n]" -n 1 -r
|
||||
$INTERACTIVE && read -p "Start setup? [y/n]" -n 1 -r || REPLY="y"
|
||||
echo ""
|
||||
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]
|
||||
@@ -49,10 +62,14 @@ then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
(set -x; pip install -r requirements.txt)
|
||||
(set -x; npm install)
|
||||
(set -x; python manage.py migrate)
|
||||
(set -x; python manage.py createdefaultadmin)
|
||||
set -e
|
||||
set -x
|
||||
pip install -r requirements.txt
|
||||
$USE_NPM && npm install
|
||||
python manage.py migrate
|
||||
python manage.py createdefaultadmin
|
||||
set +e
|
||||
set +x
|
||||
|
||||
echo "Done."
|
||||
echo "Run 'python manage.py runserver 0.0.0.0:8000' to start the development server!"
|
||||
|
||||
+35
-15
@@ -19,6 +19,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
IS_DOCKER = bool(os.getenv('IS_DOCKER', None))
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
|
||||
@@ -29,12 +30,16 @@ SECRET_KEY = '7p$85^4ibb^p4-=vs44b7!y0e-zemugze18@a#30&71=a8)dp('
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = []
|
||||
if not IS_DOCKER:
|
||||
ALLOWED_HOSTS = []
|
||||
else:
|
||||
ALLOWED_HOSTS = ["*"]
|
||||
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'modeltranslation', # has to be before admin for translation admin stuff to work
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
@@ -49,6 +54,8 @@ INSTALLED_APPS = [
|
||||
'django_nose',
|
||||
'bootstrap3',
|
||||
'django_tables2',
|
||||
'auditlog',
|
||||
'phonenumber_field',
|
||||
]
|
||||
|
||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
||||
@@ -72,6 +79,7 @@ MIDDLEWARE_CLASSES = [
|
||||
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'auditlog.middleware.AuditlogMiddleware'
|
||||
]
|
||||
CORS_ORIGIN_ALLOW_ALL = True
|
||||
|
||||
@@ -102,20 +110,32 @@ WSGI_APPLICATION = 'sikweb.wsgi.application'
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'sik',
|
||||
'USER': 'sik',
|
||||
'PASSWORD': 'password123',
|
||||
'HOST': 'localhost',
|
||||
'PORT': '5432',
|
||||
'TEST': {
|
||||
'NAME': 'sik_test',
|
||||
if not IS_DOCKER:
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'sik',
|
||||
'USER': 'sik',
|
||||
'PASSWORD': 'password123',
|
||||
'HOST': 'localhost',
|
||||
'PORT': '5432',
|
||||
'TEST': {
|
||||
'NAME': 'sik_test',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
}
|
||||
else:
|
||||
logging.info('Using docker database configuration')
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'postgres',
|
||||
'USER': 'postgres',
|
||||
'PASSWORD': 'postgres',
|
||||
'HOST': 'db',
|
||||
'PORT': '5432',
|
||||
},
|
||||
}
|
||||
# Password validation
|
||||
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
|
||||
|
||||
@@ -175,8 +195,8 @@ LOGPATH = "logs/debug.log"
|
||||
# https://docs.djangoproject.com/en/1.9/topics/i18n/
|
||||
|
||||
LANGUAGES = (
|
||||
('en', _('English')),
|
||||
('fi', _('Finnish')),
|
||||
('en', _('English')),
|
||||
)
|
||||
|
||||
LANGUAGE_CODE = 'fi'
|
||||
|
||||
Executable
+177
@@ -0,0 +1,177 @@
|
||||
#!/usr/bin/env bash
|
||||
# Use this script to test if a given TCP host/port are available
|
||||
|
||||
cmdname=$(basename $0)
|
||||
|
||||
echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
|
||||
|
||||
usage()
|
||||
{
|
||||
cat << USAGE >&2
|
||||
Usage:
|
||||
$cmdname host:port [-s] [-t timeout] [-- command args]
|
||||
-h HOST | --host=HOST Host or IP under test
|
||||
-p PORT | --port=PORT TCP port under test
|
||||
Alternatively, you specify the host and port as host:port
|
||||
-s | --strict Only execute subcommand if the test succeeds
|
||||
-q | --quiet Don't output any status messages
|
||||
-t TIMEOUT | --timeout=TIMEOUT
|
||||
Timeout in seconds, zero for no timeout
|
||||
-- COMMAND ARGS Execute command with args after the test finishes
|
||||
USAGE
|
||||
exit 1
|
||||
}
|
||||
|
||||
wait_for()
|
||||
{
|
||||
if [[ $TIMEOUT -gt 0 ]]; then
|
||||
echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT"
|
||||
else
|
||||
echoerr "$cmdname: waiting for $HOST:$PORT without a timeout"
|
||||
fi
|
||||
start_ts=$(date +%s)
|
||||
while :
|
||||
do
|
||||
if [[ $ISBUSY -eq 1 ]]; then
|
||||
nc -z $HOST $PORT
|
||||
result=$?
|
||||
else
|
||||
(echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1
|
||||
result=$?
|
||||
fi
|
||||
if [[ $result -eq 0 ]]; then
|
||||
end_ts=$(date +%s)
|
||||
echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
return $result
|
||||
}
|
||||
|
||||
wait_for_wrapper()
|
||||
{
|
||||
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
|
||||
if [[ $QUIET -eq 1 ]]; then
|
||||
timeout $BUSYTIMEFLAG $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
|
||||
else
|
||||
timeout $BUSYTIMEFLAG $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
|
||||
fi
|
||||
PID=$!
|
||||
trap "kill -INT -$PID" INT
|
||||
wait $PID
|
||||
RESULT=$?
|
||||
if [[ $RESULT -ne 0 ]]; then
|
||||
echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT"
|
||||
fi
|
||||
return $RESULT
|
||||
}
|
||||
|
||||
# process arguments
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
case "$1" in
|
||||
*:* )
|
||||
hostport=(${1//:/ })
|
||||
HOST=${hostport[0]}
|
||||
PORT=${hostport[1]}
|
||||
shift 1
|
||||
;;
|
||||
--child)
|
||||
CHILD=1
|
||||
shift 1
|
||||
;;
|
||||
-q | --quiet)
|
||||
QUIET=1
|
||||
shift 1
|
||||
;;
|
||||
-s | --strict)
|
||||
STRICT=1
|
||||
shift 1
|
||||
;;
|
||||
-h)
|
||||
HOST="$2"
|
||||
if [[ $HOST == "" ]]; then break; fi
|
||||
shift 2
|
||||
;;
|
||||
--host=*)
|
||||
HOST="${1#*=}"
|
||||
shift 1
|
||||
;;
|
||||
-p)
|
||||
PORT="$2"
|
||||
if [[ $PORT == "" ]]; then break; fi
|
||||
shift 2
|
||||
;;
|
||||
--port=*)
|
||||
PORT="${1#*=}"
|
||||
shift 1
|
||||
;;
|
||||
-t)
|
||||
TIMEOUT="$2"
|
||||
if [[ $TIMEOUT == "" ]]; then break; fi
|
||||
shift 2
|
||||
;;
|
||||
--timeout=*)
|
||||
TIMEOUT="${1#*=}"
|
||||
shift 1
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
CLI=("$@")
|
||||
break
|
||||
;;
|
||||
--help)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
echoerr "Unknown argument: $1"
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "$HOST" == "" || "$PORT" == "" ]]; then
|
||||
echoerr "Error: you need to provide a host and port to test."
|
||||
usage
|
||||
fi
|
||||
|
||||
TIMEOUT=${TIMEOUT:-15}
|
||||
STRICT=${STRICT:-0}
|
||||
CHILD=${CHILD:-0}
|
||||
QUIET=${QUIET:-0}
|
||||
|
||||
# check to see if timeout is from busybox?
|
||||
# check to see if timeout is from busybox?
|
||||
TIMEOUT_PATH=$(realpath $(which timeout))
|
||||
if [[ $TIMEOUT_PATH =~ "busybox" ]]; then
|
||||
ISBUSY=1
|
||||
BUSYTIMEFLAG="-t"
|
||||
else
|
||||
ISBUSY=0
|
||||
BUSYTIMEFLAG=""
|
||||
fi
|
||||
|
||||
if [[ $CHILD -gt 0 ]]; then
|
||||
wait_for
|
||||
RESULT=$?
|
||||
exit $RESULT
|
||||
else
|
||||
if [[ $TIMEOUT -gt 0 ]]; then
|
||||
wait_for_wrapper
|
||||
RESULT=$?
|
||||
else
|
||||
wait_for
|
||||
RESULT=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $CLI != "" ]]; then
|
||||
if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then
|
||||
echoerr "$cmdname: strict mode, refusing to execute subprocess"
|
||||
exit $RESULT
|
||||
fi
|
||||
exec "${CLI[@]}"
|
||||
else
|
||||
exit $RESULT
|
||||
fi
|
||||
+15
-1
@@ -1,3 +1,17 @@
|
||||
from django.contrib import admin
|
||||
from webapp.models import Official, Role
|
||||
from webapp.models import Feed, Tag, BaseFeed, Event
|
||||
from webapp.models import KaehmyForm, KaehmyMessage
|
||||
from webapp.models import CustomKaehmyRole, PresetKaehmyRole
|
||||
from modeltranslation.admin import TranslationAdmin
|
||||
|
||||
# Register your models here.
|
||||
|
||||
admin.site.register(Feed, TranslationAdmin)
|
||||
admin.site.register(Tag, TranslationAdmin)
|
||||
admin.site.register(Event, 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)
|
||||
|
||||
@@ -3,3 +3,6 @@ from django.apps import AppConfig
|
||||
|
||||
class WebappConfig(AppConfig):
|
||||
name = 'webapp'
|
||||
|
||||
def ready(self):
|
||||
import webapp.translations
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-01 16:19
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
import webapp.utils
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Feed',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('publish_time', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('autohide', models.BooleanField(default=False)),
|
||||
('autohide_time', models.DateTimeField(default=webapp.utils.month_from_now)),
|
||||
('topic', models.CharField(max_length=255)),
|
||||
('description', models.CharField(max_length=255)),
|
||||
('content', models.TextField()),
|
||||
],
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='info',
|
||||
name='tags',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='infotr',
|
||||
name='translation_for',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='tagtr',
|
||||
name='translation_for',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='tag',
|
||||
name='dummyname',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tag',
|
||||
name='name',
|
||||
field=models.CharField(default='', max_length=127),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tag',
|
||||
name='slug',
|
||||
field=models.SlugField(default=''),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='Info',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='InfoTr',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='TagTr',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='feed',
|
||||
name='tags',
|
||||
field=models.ManyToManyField(related_name='news', to='webapp.Tag'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,69 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 15:20
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
import django.contrib.auth.models
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('auth', '0008_alter_user_username_max_length'),
|
||||
('webapp', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='BaseRole',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.TextField(verbose_name='Name')),
|
||||
('is_board', models.BooleanField(verbose_name='Board member')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Official',
|
||||
fields=[
|
||||
('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
|
||||
('phone_number', models.TextField(verbose_name='Phone number')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'user',
|
||||
'verbose_name_plural': 'users',
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('auth.user',),
|
||||
managers=[
|
||||
('objects', django.contrib.auth.models.UserManager()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CustomRole',
|
||||
fields=[
|
||||
('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')),
|
||||
],
|
||||
bases=('webapp.baserole',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PresetRole',
|
||||
fields=[
|
||||
('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')),
|
||||
('description', models.TextField(verbose_name='Description')),
|
||||
('summary', models.TextField(verbose_name='Summary')),
|
||||
],
|
||||
bases=('webapp.baserole',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Role',
|
||||
fields=[
|
||||
('presetrole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.PresetRole')),
|
||||
('start_date', models.DateField(verbose_name='Start date')),
|
||||
('end_date', models.DateField(verbose_name='End date')),
|
||||
('official', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='webapp.Official')),
|
||||
],
|
||||
bases=('webapp.presetrole',),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 13:43
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0002_auto_20170601_1919'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='feed',
|
||||
name='content_en',
|
||||
field=models.TextField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='feed',
|
||||
name='content_fi',
|
||||
field=models.TextField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='feed',
|
||||
name='description_en',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='feed',
|
||||
name='description_fi',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='feed',
|
||||
name='topic_en',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='feed',
|
||||
name='topic_fi',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 15:25
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0002_baserole_customrole_official_presetrole_role'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='role',
|
||||
options={'verbose_name': 'Official'},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 14:12
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0003_auto_20170607_1643'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='feed',
|
||||
name='tags',
|
||||
field=models.ManyToManyField(blank=True, related_name='news', to='webapp.Tag'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 15:26
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0003_auto_20170607_1825'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='official',
|
||||
options={'verbose_name': 'Official'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='role',
|
||||
options={'verbose_name': 'Role'},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 14:17
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0004_auto_20170607_1712'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='tag',
|
||||
name='name_en',
|
||||
field=models.CharField(max_length=127, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tag',
|
||||
name='name_fi',
|
||||
field=models.CharField(max_length=127, null=True),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-01 16:19
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
import webapp.utils
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0005_auto_20170607_1717'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.DeleteModel(
|
||||
name='Tag',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='Feed',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,61 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 15:15
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
import webapp.utils
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0006_delete_deprecated_models'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='BaseFeed',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('visible', models.BooleanField(default=True)),
|
||||
('title', models.CharField(max_length=255)),
|
||||
('description', models.CharField(max_length=255)),
|
||||
('content', models.TextField()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Tag',
|
||||
fields=[
|
||||
('slug', models.SlugField(primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=127)),
|
||||
('icon', models.ImageField(upload_to='')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Event',
|
||||
fields=[
|
||||
('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')),
|
||||
('start_time', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('end_time', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
],
|
||||
bases=('webapp.basefeed',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Feed',
|
||||
fields=[
|
||||
('basefeed_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseFeed')),
|
||||
('publish_time', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('autohide', models.DateTimeField(default=webapp.utils.month_from_now)),
|
||||
],
|
||||
bases=('webapp.basefeed',),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='basefeed',
|
||||
name='tags',
|
||||
field=models.ManyToManyField(blank=True, related_name='feeds', to='webapp.Tag'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,55 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 15:28
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0007_auto_20170607_1815'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='basefeed',
|
||||
name='content_en',
|
||||
field=models.TextField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='basefeed',
|
||||
name='content_fi',
|
||||
field=models.TextField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='basefeed',
|
||||
name='description_en',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='basefeed',
|
||||
name='description_fi',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='basefeed',
|
||||
name='title_en',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='basefeed',
|
||||
name='title_fi',
|
||||
field=models.CharField(max_length=255, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tag',
|
||||
name='name_en',
|
||||
field=models.CharField(max_length=127, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tag',
|
||||
name='name_fi',
|
||||
field=models.CharField(max_length=127, null=True),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-07 15:54
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0008_auto_20170607_1828'),
|
||||
('webapp', '0004_auto_20170607_1826'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
]
|
||||
@@ -0,0 +1,74 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-06-08 06:24
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0009_merge_20170607_1854'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CustomKaehmyRole',
|
||||
fields=[
|
||||
('baserole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.BaseRole')),
|
||||
],
|
||||
bases=('webapp.baserole',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MessageParent',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PresetKaehmyRole',
|
||||
fields=[
|
||||
('presetrole_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.PresetRole')),
|
||||
],
|
||||
bases=('webapp.presetrole',),
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='customrole',
|
||||
name='baserole_ptr',
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='KaehmyForm',
|
||||
fields=[
|
||||
('messageparent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.MessageParent')),
|
||||
('name', models.TextField(verbose_name='Name')),
|
||||
('email', models.EmailField(max_length=254, verbose_name='Email')),
|
||||
('year', models.IntegerField(verbose_name='Year')),
|
||||
],
|
||||
bases=('webapp.messageparent',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='KaehmyMessage',
|
||||
fields=[
|
||||
('messageparent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='webapp.MessageParent')),
|
||||
('name', models.TextField(verbose_name='Name')),
|
||||
('email', models.EmailField(max_length=254, verbose_name='Email')),
|
||||
('message', models.TextField(verbose_name='Message')),
|
||||
('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='webapp.MessageParent')),
|
||||
],
|
||||
bases=('webapp.messageparent',),
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='CustomRole',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='presetkaehmyrole',
|
||||
name='form',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='preset_roles', to='webapp.KaehmyForm'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='customkaehmyrole',
|
||||
name='form',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='custom_roles', to='webapp.KaehmyForm'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,36 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11 on 2017-09-13 15:41
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import phonenumber_field.modelfields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('webapp', '0010_auto_20170608_0924'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='baserole',
|
||||
name='name',
|
||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='kaehmyform',
|
||||
name='name',
|
||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='kaehmymessage',
|
||||
name='name',
|
||||
field=models.CharField(max_length=256, verbose_name='Name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='official',
|
||||
name='phone_number',
|
||||
field=phonenumber_field.modelfields.PhoneNumberField(max_length=128, verbose_name='Phone number'),
|
||||
),
|
||||
]
|
||||
+108
-25
@@ -1,37 +1,120 @@
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from datetime import timedelta
|
||||
from django.contrib.auth.models import User
|
||||
from webapp.utils import month_from_now
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.contrib.auth.models import User
|
||||
from auditlog.registry import auditlog
|
||||
from phonenumber_field.modelfields import PhoneNumberField
|
||||
|
||||
|
||||
class Tag(models.Model):
|
||||
# ALWAYS USE TRANSLATED NAME!!!
|
||||
dummyname = models.CharField(max_length=127)
|
||||
|
||||
|
||||
class TagTr(models.Model):
|
||||
'''
|
||||
Model containing translations for tags
|
||||
'''
|
||||
lang = models.CharField(max_length=2, default='fi')
|
||||
slug = models.SlugField(primary_key=True)
|
||||
name = models.CharField(max_length=127)
|
||||
translation_for = models.ForeignKey('Tag', related_name='translations')
|
||||
icon = models.ImageField()
|
||||
|
||||
|
||||
class Info(models.Model):
|
||||
class BaseFeed(models.Model):
|
||||
'''
|
||||
model containing something showing on some info feed
|
||||
'''
|
||||
publish_time = models.DateTimeField(default=timezone.now)
|
||||
|
||||
# published_by = models.Foreignkey(User) #<-- TODO create usermodel
|
||||
tags = models.ManyToManyField(Tag, related_name="news")
|
||||
|
||||
|
||||
class InfoTr(models.Model):
|
||||
'''
|
||||
Model containing translations for news
|
||||
'''
|
||||
lang = models.CharField(max_length=2, default='fi')
|
||||
|
||||
topic = models.CharField(max_length=255)
|
||||
tags = models.ManyToManyField(Tag, related_name="feeds", blank=True)
|
||||
visible = models.BooleanField(default=True)
|
||||
title = models.CharField(max_length=255)
|
||||
description = models.CharField(max_length=255)
|
||||
content = models.TextField()
|
||||
translation_for = models.ForeignKey('Info', related_name='translations')
|
||||
|
||||
|
||||
class Feed(BaseFeed):
|
||||
|
||||
publish_time = models.DateTimeField(default=timezone.now)
|
||||
autohide = models.DateTimeField(default=month_from_now)
|
||||
|
||||
|
||||
class Event(BaseFeed):
|
||||
start_time = models.DateTimeField(default=timezone.now)
|
||||
end_time = models.DateTimeField(default=timezone.now)
|
||||
|
||||
|
||||
class BaseRole(models.Model):
|
||||
'''
|
||||
Base model for occupations/roles
|
||||
'''
|
||||
name = models.CharField(_('Name'), max_length=256)
|
||||
is_board = models.BooleanField(_('Board member'))
|
||||
|
||||
|
||||
class PresetRole(BaseRole):
|
||||
'''
|
||||
Model representing a preset occupation in the guild
|
||||
'''
|
||||
description = models.TextField(_('Description'))
|
||||
summary = models.TextField(_('Summary'))
|
||||
|
||||
|
||||
class PresetKaehmyRole(PresetRole):
|
||||
form = models.ForeignKey('KaehmyForm', related_name='preset_roles')
|
||||
|
||||
|
||||
class CustomKaehmyRole(BaseRole):
|
||||
'''
|
||||
Model representing a user-specified custom occupation
|
||||
'''
|
||||
form = models.ForeignKey('KaehmyForm', related_name='custom_roles')
|
||||
|
||||
|
||||
class MessageParent(models.Model):
|
||||
pass
|
||||
|
||||
|
||||
class KaehmyMessage(MessageParent):
|
||||
'''
|
||||
Model representing a kaehmymessage.
|
||||
Every message relates to certain kaehmyform or parent message.
|
||||
'''
|
||||
name = models.CharField(_('Name'), max_length=256)
|
||||
email = models.EmailField(_('Email'))
|
||||
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.
|
||||
'''
|
||||
name = models.CharField(_('Name'), max_length=256)
|
||||
email = models.EmailField(_('Email'))
|
||||
year = models.IntegerField(_('Year'))
|
||||
|
||||
|
||||
class Role(PresetRole):
|
||||
'''
|
||||
Model representing an active or historical occupation
|
||||
in an official's history
|
||||
'''
|
||||
class Meta:
|
||||
verbose_name = _('Role')
|
||||
|
||||
start_date = models.DateField(_('Start date'))
|
||||
end_date = models.DateField(_('End date'))
|
||||
official = models.ForeignKey('Official', related_name='roles')
|
||||
|
||||
|
||||
class Official(User):
|
||||
'''
|
||||
Model representing a guild official
|
||||
'''
|
||||
class Meta:
|
||||
verbose_name = _('Official')
|
||||
|
||||
phone_number = PhoneNumberField(_('Phone number'))
|
||||
|
||||
|
||||
auditlog.register(Tag)
|
||||
auditlog.register(Feed)
|
||||
auditlog.register(Event)
|
||||
auditlog.register(PresetRole)
|
||||
auditlog.register(Role)
|
||||
auditlog.register(Official)
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
from modeltranslation.translator import register, TranslationOptions
|
||||
from webapp.models import BaseFeed, Feed, Tag, Event
|
||||
|
||||
|
||||
@register(BaseFeed)
|
||||
class BaseFeedTranslationOptions(TranslationOptions):
|
||||
fields = ('title', 'description', 'content')
|
||||
|
||||
|
||||
@register(Feed)
|
||||
class FeedTranslationOptions(TranslationOptions):
|
||||
fields = ()
|
||||
|
||||
|
||||
@register(Event)
|
||||
class EventTranslationOptions(TranslationOptions):
|
||||
fields = ()
|
||||
|
||||
|
||||
@register(Tag)
|
||||
class TagTranslationOptions(TranslationOptions):
|
||||
fields = ('name',)
|
||||
@@ -0,0 +1,6 @@
|
||||
from django.utils import timezone
|
||||
from datetime import timedelta
|
||||
|
||||
|
||||
def month_from_now():
|
||||
return timezone.now() + timedelta(days=30)
|
||||
Reference in New Issue
Block a user