diff --git a/.gitignore b/.gitignore index 91b71ce..9ebda35 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ coverage.xml *,cover # Translations -*.mo +#*.mo We need them for dev-purposes for now. *.pot # Django stuff: diff --git a/mercantile/locale/nb/LC_MESSAGES/django.mo b/mercantile/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..961a577 Binary files /dev/null and b/mercantile/locale/nb/LC_MESSAGES/django.mo differ diff --git a/mercantile/locale/nb/LC_MESSAGES/django.po b/mercantile/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..59033fc --- /dev/null +++ b/mercantile/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,71 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-08-16 21:18+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: models.py:13 models.py:28 models.py:42 +msgid "Amount owed" +msgstr "Sum skyldt" + +#: models.py:14 +msgid "Debtor" +msgstr "Skylder" + +#: models.py:15 +msgid "Debtee" +msgstr "Kreditor" + +#: models.py:18 +msgid "Total debt" +msgstr "Sammenlagt gjeld" + +#: models.py:19 +msgid "Total debts" +msgstr "Sammenlagte gjelder" + +#: models.py:26 models.py:40 +msgid "Connected debt" +msgstr "Tilhørende gjeld" + +#: models.py:27 +msgid "Connected event" +msgstr "Tilhørende event" + +#: models.py:29 +msgid "Date integrated" +msgstr "Dato integrert" + +#: models.py:32 +msgid "Calculation" +msgstr "Kalkulering" + +#: models.py:33 +msgid "Calculations" +msgstr "Kalkuleringer" + +#: models.py:41 +msgid "Date made" +msgstr "Dato gjort" + +#: models.py:45 +msgid "Cash settlement" +msgstr "Kontantoppgjør" + +#: models.py:46 +msgid "Cash settlements" +msgstr "Kontantoppgjør" diff --git a/mercantile/models.py b/mercantile/models.py index c5454dc..1c6d324 100644 --- a/mercantile/models.py +++ b/mercantile/models.py @@ -1,28 +1,47 @@ from django.db import models +from django.utils.translation import ugettext_lazy as _ from waffles.models import Event, UserProfile -# Create your models here. - - class Debt(models.Model): - amount = models.BigIntegerField() - debtor = models.ForeignKey(UserProfile, related_name="debtor") - debtee = models.ForeignKey(UserProfile, related_name="debtee") + """ + The total debt owed by debtor to debtee. + + If system is consistent this will be the sum of calculation.amount + and settlement.amount + """ + amount = models.BigIntegerField(verbose_name=_("Amount owed")) + debtor = models.ForeignKey(UserProfile, related_name="debtor", verbose_name=_("Debtor")) + debtee = models.ForeignKey(UserProfile, related_name="debtee", verbose_name=_("Debtee")) + + class Meta: + verbose_name = _('Total debt') + verbose_name_plural = _('Total debts') -# oversikt over oppgjør, for logging class Calculation(models.Model): - debt = models.ForeignKey(Debt) - event = models.ForeignKey(Event) - date = models.DateTimeField() + """ + This is a single calculation of debt from an event. + """ + debt = models.ForeignKey(Debt, verbose_name=_("Connected debt")) + event = models.ForeignKey(Event, _("Connected event")) + amount = models.IntegerField(verbose_name=_("Amount owed")) + date = models.DateTimeField(verbose_name=_("Date integrated")) + + class Meta: + verbose_name = _('Calculation') + verbose_name_plural = _('Calculations') -# Lagring av oppgjør class Settlement(models.Model): - debt = models.ForeignKey(Debt) - dato = models.DateField() - amount = models.IntegerField() - + """ + When part of or a whole debt is settled in 'cash' + """ + debt = models.ForeignKey(Debt, verbose_name=_("Connected debt")) + date = models.DateField(verbose_name=_("Date made")) + amount = models.IntegerField(verbose_name=_("Amount owed")) + class Meta: + verbose_name = _('Cash settlement') + verbose_name_plural = _('Cash settlements') diff --git a/vafling/settings.py b/vafling/settings.py index 5e79cf4..32d0589 100644 --- a/vafling/settings.py +++ b/vafling/settings.py @@ -87,9 +87,9 @@ DATABASES = { # Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'nb-no' -TIME_ZONE = 'UTC' +TIME_ZONE = 'CET' USE_I18N = True diff --git a/waffles/admin.py b/waffles/admin.py index baa2e98..b83df8f 100644 --- a/waffles/admin.py +++ b/waffles/admin.py @@ -1,11 +1,11 @@ from django.contrib import admin -from .models import UserProfile, Community, Event, Listing, ShoppingList, Subevent +from .models import UserProfile, Community, Event, Listing, ShoppingList, SubEvent # Register your models here. -@admin.register(UserProfile, Community, Event, Listing, ShoppingList, Subevent) +@admin.register(UserProfile, Community, Event, Listing, ShoppingList, SubEvent) class GenericAdmin(admin.ModelAdmin): pass diff --git a/waffles/locale/nb/LC_MESSAGES/django.mo b/waffles/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..23f3953 Binary files /dev/null and b/waffles/locale/nb/LC_MESSAGES/django.mo differ diff --git a/waffles/locale/nb/LC_MESSAGES/django.po b/waffles/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..225b490 --- /dev/null +++ b/waffles/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,123 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-08-16 21:17+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: models.py:13 +msgid "User profile" +msgstr "Brukerprofil" + +#: models.py:14 +msgid "User profiles" +msgstr "Bruerprofiler" + +#: models.py:24 +msgid "Community name" +msgstr "Community navn" + +#: models.py:25 +msgid "Community members" +msgstr "Community medlemmer" + +#: models.py:28 models.py:38 +msgid "Community" +msgstr "Community" + +#: models.py:29 +msgid "Communities" +msgstr "Communitier" + +#: models.py:39 models.py:60 +msgid "Start time" +msgstr "Starttid" + +#: models.py:40 models.py:61 +msgid "End time" +msgstr "Sluttid" + +#: models.py:41 +msgid "Requesting user" +msgstr "Forespørrende bruker" + +#: models.py:42 models.py:56 +msgid "Description/text" +msgstr "Beskrivelse/tekst" + +#: models.py:45 models.py:46 +msgid "Listing" +msgstr "Forespørsel" + +#: models.py:55 +msgid "Event name" +msgstr "Event navn" + +#: models.py:57 +msgid "Open for new participants" +msgstr "Åpen for nye deltakere" + +#: models.py:58 +msgid "Finalized" +msgstr "Avsluttet" + +#: models.py:59 models.py:75 +msgid "Participants" +msgstr "Deltakere" + +#: models.py:64 +msgid "Event" +msgstr "Event" + +#: models.py:65 +msgid "Events" +msgstr "Eventer" + +#: models.py:74 models.py:89 +msgid "Name" +msgstr "Navn" + +#: models.py:76 +msgid "Parent event" +msgstr "Overordnet event" + +#: models.py:79 +msgid "Sub Event" +msgstr "Underevent" + +#: models.py:80 +msgid "Sub Events" +msgstr "Undereventer" + +#: models.py:90 +msgid "Price" +msgstr "Pris" + +#: models.py:91 +msgid "Payers" +msgstr "Betalt av" + +#: models.py:92 +msgid "Connected sub-event" +msgstr "Tilhørende subevent" + +#: models.py:95 +msgid "Shopping list" +msgstr "Handleliste" + +#: models.py:96 +msgid "Shopping lists" +msgstr "Hendlelister" diff --git a/waffles/migrations/0003_auto_20150816_2109.py b/waffles/migrations/0003_auto_20150816_2109.py new file mode 100644 index 0000000..581f8f3 --- /dev/null +++ b/waffles/migrations/0003_auto_20150816_2109.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import datetime + +from django.db import models, migrations +from django.utils.timezone import utc +from django.conf import settings + + +class Migration(migrations.Migration): + dependencies = [ + ('waffles', '0002_auto_20150816_1357'), + ] + + operations = [ + migrations.AlterModelOptions( + name='community', + options={'verbose_name': 'Community', 'verbose_name_plural': 'Communities'}, + ), + migrations.AlterModelOptions( + name='event', + options={'verbose_name': 'Event', 'verbose_name_plural': 'Events'}, + ), + migrations.AlterModelOptions( + name='listing', + options={'verbose_name': 'Listing', 'verbose_name_plural': 'Listing'}, + ), + migrations.AlterModelOptions( + name='shoppinglist', + options={'verbose_name': 'Shopping list', 'verbose_name_plural': 'Shopping lists'}, + ), + migrations.AlterModelOptions( + name='subevent', + options={'verbose_name': 'Sub Event', 'verbose_name_plural': 'Sub Events'}, + ), + migrations.AlterModelOptions( + name='userprofile', + options={'verbose_name': 'User profile', 'verbose_name_plural': 'User profiles'}, + ), + migrations.AddField( + model_name='event', + name='open', + field=models.BooleanField(default=datetime.datetime(2015, 8, 16, 19, 9, 38, 507600, tzinfo=utc), + verbose_name='Open for new participants'), + preserve_default=False, + ), + migrations.AlterField( + model_name='community', + name='members', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, db_constraint='Community members'), + ), + migrations.AlterField( + model_name='community', + name='name', + field=models.CharField(verbose_name='Community name', max_length=64), + ), + migrations.AlterField( + model_name='event', + name='description', + field=models.TextField(verbose_name='Description/text'), + ), + migrations.AlterField( + model_name='event', + name='name', + field=models.CharField(verbose_name='Event name', max_length=64), + ), + migrations.AlterField( + model_name='event', + name='participants', + field=models.ManyToManyField(verbose_name='Participants', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='event', + name='status', + field=models.BooleanField(verbose_name='Finalized'), + ), + migrations.AlterField( + model_name='event', + name='timeFrom', + field=models.DateTimeField(verbose_name='Start time'), + ), + migrations.AlterField( + model_name='event', + name='timeTo', + field=models.DateTimeField(verbose_name='End time'), + ), + migrations.AlterField( + model_name='listing', + name='community', + field=models.ForeignKey(to='waffles.Community', verbose_name='Community'), + ), + migrations.AlterField( + model_name='listing', + name='description', + field=models.TextField(verbose_name='Description/text'), + ), + migrations.AlterField( + model_name='listing', + name='timeFrom', + field=models.DateTimeField(verbose_name='Start time'), + ), + migrations.AlterField( + model_name='listing', + name='timeTo', + field=models.DateTimeField(verbose_name='End time'), + ), + migrations.AlterField( + model_name='listing', + name='user', + field=models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Requesting user'), + ), + migrations.AlterField( + model_name='shoppinglist', + name='name', + field=models.CharField(verbose_name='Name', max_length=64), + ), + migrations.AlterField( + model_name='shoppinglist', + name='payers', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, db_constraint='Payers'), + ), + migrations.AlterField( + model_name='shoppinglist', + name='price', + field=models.IntegerField(verbose_name='Price'), + ), + migrations.AlterField( + model_name='shoppinglist', + name='subevent', + field=models.ForeignKey(to='waffles.SubEvent', to_field='Connected sub-event'), + ), + migrations.AlterField( + model_name='subevent', + name='event', + field=models.ForeignKey(to='waffles.Event', to_field='Parent event'), + ), + migrations.AlterField( + model_name='subevent', + name='name', + field=models.CharField(verbose_name='Name', max_length=64), + ), + migrations.AlterField( + model_name='subevent', + name='participants', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, db_constraint='Participants'), + ), + ] diff --git a/waffles/models.py b/waffles/models.py index d8164a6..d82b854 100644 --- a/waffles/models.py +++ b/waffles/models.py @@ -1,48 +1,96 @@ -from django.contrib.auth.models import AbstractUser from django.db import models - - -# Create your models here. +from django.contrib.auth.models import AbstractUser +from django.utils.translation import ugettext_lazy as _ class UserProfile(AbstractUser): + """ + User profile + """ pass + class Meta: + verbose_name = _('User profile') + verbose_name_plural = _('User profiles') + class Community(models.Model): - name = models.CharField(max_length=64) - members = models.ManyToManyField(UserProfile) + """ + Community + + It works kind of like a django group, but is intended to + grow more complex over time. + """ + name = models.CharField(max_length=64, verbose_name=_("Community name")) + members = models.ManyToManyField(UserProfile, _("Community members")) + + class Meta: + verbose_name = _('Community') + verbose_name_plural = _('Communities') -# Jeg har lyst til å vafle! -# Er det noen som er med? class Listing(models.Model): - community = models.ForeignKey(Community) - timeFrom = models.DateTimeField() - timeTo = models.DateTimeField() - user = models.ForeignKey(UserProfile) - description = models.TextField() + """ + Listing requesting interest in creating an event. + + Supposed to be removed and replaced with an event when someone answers it. + """ + community = models.ForeignKey(Community, verbose_name=_("Community")) + timeFrom = models.DateTimeField(verbose_name=_("Start time")) + timeTo = models.DateTimeField(verbose_name=_("End time")) + user = models.ForeignKey(UserProfile, verbose_name=_("Requesting user")) + description = models.TextField(verbose_name=_("Description/text")) + + class Meta: + verbose_name = _('Listing') + verbose_name_plural = _('Listing') class Event(models.Model): - name = models.CharField(max_length=64) - description = models.TextField() - status = models.BooleanField() # closed - no more edits - participants = models.ManyToManyField(UserProfile) - timeFrom = models.DateTimeField() - timeTo = models.DateTimeField() + """ + Event + + A loose collection of participants at a location at a given time + """ + name = models.CharField(max_length=64, verbose_name=_("Event name")) + description = models.TextField(verbose_name=_("Description/text")) + open = models.BooleanField(verbose_name=_("Open for new participants")) + status = models.BooleanField(verbose_name=_("Finalized")) + participants = models.ManyToManyField(UserProfile, verbose_name=_("Participants")) + timeFrom = models.DateTimeField(verbose_name=_("Start time")) + timeTo = models.DateTimeField(verbose_name=_("End time")) + + class Meta: + verbose_name = _('Event') + verbose_name_plural = _('Events') -class Subevent(models.Model): - name = models.CharField(max_length=64) - participants = models.ManyToManyField(UserProfile) - event = models.ForeignKey(Event) +class SubEvent(models.Model): + """ + Used to group parts of an event into smaller groups. + + Used when not everyone is participating in the entire event. + """ + name = models.CharField(max_length=64, verbose_name=_("Name")) + participants = models.ManyToManyField(UserProfile, _("Participants")) + event = models.ForeignKey(Event, _("Parent event")) + + class Meta: + verbose_name = _('Sub Event') + verbose_name_plural = _('Sub Events') class ShoppingList(models.Model): - name = models.CharField(max_length=64) - price = models.IntegerField() - payers = models.ManyToManyField(UserProfile) - subevent = models.ForeignKey(Subevent) + """ + Item to be bought or bought to the sub-event + The reason for using sub-events. Any responsibilities and duties here are isolated within the sub-event. + """ + name = models.CharField(max_length=64, verbose_name=_("Name")) + price = models.IntegerField(verbose_name=_("Price")) + payers = models.ManyToManyField(UserProfile, _("Payers")) + subevent = models.ForeignKey(SubEvent, _("Connected sub-event")) + class Meta: + verbose_name = _('Shopping list') + verbose_name_plural = _('Shopping lists')