Merge branch 'develop' into 'master'

Develop

Closes #71 and #72

See merge request !37
This commit is contained in:
Jan Tuomi
2017-09-18 19:10:09 +03:00
37 changed files with 1243 additions and 183 deletions
+49 -12
View File
@@ -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"
+1
View File
@@ -0,0 +1 @@
global_static
+8
View File
@@ -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/
+13
View File
@@ -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(),
),
]
+2 -2
View File
@@ -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.
+91 -51
View File
@@ -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.
+85 -54
View File
@@ -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"
+2
View File
@@ -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'
+4
View File
@@ -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
View File
@@ -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"]
}
}
+21 -11
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
uWSGI==2.0.14
+3 -1
View File
@@ -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
+26 -9
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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)
+22
View File
@@ -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',)
+6
View File
@@ -0,0 +1,6 @@
from django.utils import timezone
from datetime import timedelta
def month_from_now():
return timezone.now() + timedelta(days=30)