Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean up DAK handling #116

Merged
merged 5 commits into from
Jan 7, 2020
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
* text=auto
*.txt text
*.json text eol=lf
*.xml text eol=lf
.gitattributes text eol=lf
4 changes: 2 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
"python.testing.unittestArgs": [
"-v",
"-s",
".",
"./tests",
"-p",
"*test.py"
"*_test.py"
],
"python.testing.pytestEnabled": false,
"python.testing.nosetestsEnabled": false,
Expand Down
115 changes: 54 additions & 61 deletions dakdata.py
Original file line number Diff line number Diff line change
@@ -1,93 +1,86 @@
# -*- coding: utf-8 -*-
import datetime

# http://www.sverigesforeningssystem.se/dak-formatet/vad-ar-dak/


class Deltagare:
def __init__(self, id, Foernamn, Efternamn, Personnummer, ledare, epost="", mobilNr="", postnummer=""):
self.id = id
self.Foernamn = Foernamn
self.Efternamn = Efternamn
self.Personnummer = Personnummer
self.Ledare = ledare
self.Epost = epost
self.MobilNr = mobilNr
self.Postnummer = postnummer
"""
Module for exporting data according to DAC format.

def IsFemale(self):
return False if int(self.Personnummer[-2])&1 == 1 else True
http://www.sverigesforeningssystem.se/dak-formatet/vad-ar-dak/
"""
import datetime

def AgeThisSemester(self, semester):
return int(self.Personnummer[0:4]) - semester.year
class Deltagare(object):
def __init__(self, uid, foernamn, efternamn, personnummer, ledare, epost="", mobil_nr="", postnummer=""):
self.uid = uid
self.foernamn = foernamn
self.efternamn = efternamn
self.personnummer = personnummer
self.ledare = ledare
self.epost = epost
self.mobil_nr = mobil_nr
self.postnummer = postnummer

def is_female(self):
"Return True if the person is female"
return False if int(self.personnummer[-2])&1 == 1 else True

def age_this_semester(self, semester):
"Is the person aget this semester"
return int(self.personnummer[0:4]) - semester.year

def __eq__(self, other):
return self.Personnummer == other.Personnummer
return self.personnummer == other.personnummer

def __hash__(self):
return hash(self.Personnummer)
return hash(self.personnummer)


class Sammankomst:
kod = ""
datum = None
duration = 90
Aktivitet = "Moete" # OBS en av: Traening, Match, Moete, Oevrigt
deltagare = []
ledare = []
class Sammankomst(object):

def __init__(self, kod, datum, duration, Aktivitet):
def __init__(self, kod, datum, duration, aktivitet):
self.kod = kod
self.datum = datum
self.duration = duration
self.Aktivitet = Aktivitet
self.aktivitet = aktivitet # OBS en av: Traening, Match, Moete, Oevrigt
self.deltagare = []
self.ledare = []

def GetDateString(self, formatString='%Y-%m-%d'):
return self.datum.strftime(formatString)
def get_date_string(self, format_string='%Y-%m-%d'):
return self.datum.strftime(format_string)

def GetStartTimeString(self, formatString='%H:%M:%S'):
return self.datum.strftime(formatString)
def get_start_time_string(self, format_string='%H:%M:%S'):
return self.datum.strftime(format_string)

def GetStopTimeString(self, formatString='%H:%M:%S'):
maxEndTime = self.datum.replace(hour=23,minute=59,second=59)
def get_stop_time_string(self, format_string='%H:%M:%S'):
max_end_time = self.datum.replace(hour=23, minute=59, second=59)
endtime = self.datum + datetime.timedelta(minutes=self.duration)
if endtime > maxEndTime:
endtime = maxEndTime # limit to the current day (to keep Stop time after Start time)
return endtime.strftime(formatString)
if endtime > max_end_time:
endtime = max_end_time # limit to the current day (to keep Stop time after Start time)
return endtime.strftime(format_string)

def GetAllPersons(self):
def get_all_persons(self):
return self.ledare + self.deltagare

def IsPersonAttending(self, person):
for p in self.GetAllPersons():
if p.Personnummer == person.Personnummer:
return p.Attending
def is_person_attending(self, person):
for person in self.get_all_persons():
if person.Personnummer == person.Personnummer:
return person.Attending
return False


class Narvarokort:
NaervarokortNummer=""
Sammankomster = []
Aktivitet="Moete"
Lokal="Scouthuset"
NamnPaaKort=""
deltagare = []
ledare = []

class Narvarokort(object):
def __init__(self):
self.deltagare = []
self.ledare = []
self.Sammankomster = []

self.sammankomster = []
self.naervarokort_nummer = ""
self.lokal = "Scouthuset"
self.namn_paa_kort = ""
self.aktivitet = "" # OBS en av: Traening, Match, Moete, Oevrigt

class DakData:
kommunID = ""
foreningsID = ""
foereningsNamn=u""
organisationsnummer=""
kort = None

class DakData(object):
"Main container for DAK data"
def __init__(self):
self.kort = Narvarokort()
self.kommun_id = ""
self.forenings_id = ""
self.foerenings_namn = ""
self.organisationsnummer = ""
34 changes: 17 additions & 17 deletions excelreport.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ def getFilledInExcelSpreadsheet(self):
numPersonRows = 64
startRowPersons = 13
ws = workbook.worksheets[0]
ws['E1'] = self.dak.kort.NaervarokortNummer
ws['E1'] = self.dak.kort.naervarokort_nummer
ws['I1'] = self.semester.year
ws['D2'] = self.dak.kort.NamnPaaKort
ws['D2'] = self.dak.kort.namn_paa_kort
ws['D3'] = "Scouting"
ws['D4'] = self.dak.kort.Lokal
ws['D4'] = self.dak.kort.lokal
if self.semester.ht:
ws['C7'] = 'X'
else:
Expand All @@ -27,13 +27,13 @@ def getFilledInExcelSpreadsheet(self):
ledareCount = len(self.dak.kort.ledare)
totalPersons = deltagareCount + ledareCount

for index, sammankomst in enumerate(self.dak.kort.Sammankomster):
for index, sammankomst in enumerate(self.dak.kort.sammankomster):
aktivitetColumn = 11+index
ws.cell(row=2, column=aktivitetColumn).value = sammankomst.Aktivitet
ws.cell(row=7, column=aktivitetColumn).value = sammankomst.GetStartTimeString('%H')
ws.cell(row=9, column=aktivitetColumn).value = sammankomst.GetStopTimeString('%H')
ws.cell(row=10, column=aktivitetColumn).value = sammankomst.GetDateString('%m')
ws.cell(row=11, column=aktivitetColumn).value = sammankomst.GetDateString('%d')
ws.cell(row=2, column=aktivitetColumn).value = sammankomst.aktivitet
ws.cell(row=7, column=aktivitetColumn).value = sammankomst.get_start_time_string('%H')
ws.cell(row=9, column=aktivitetColumn).value = sammankomst.get_stop_time_string('%H')
ws.cell(row=10, column=aktivitetColumn).value = sammankomst.get_date_string('%m')
ws.cell(row=11, column=aktivitetColumn).value = sammankomst.get_date_string('%d')
for deltagareindex, deltagaren in enumerate(self.dak.kort.deltagare):
if deltagaren in sammankomst.deltagare:
ws.cell(row=startRowPersons+deltagareindex, column=aktivitetColumn).value = 1
Expand All @@ -44,18 +44,18 @@ def getFilledInExcelSpreadsheet(self):

for index, deltagaren in enumerate(self.dak.kort.deltagare):
deltagarenRow = startRowPersons+index
ws.cell(row=deltagarenRow, column=2).value = deltagaren.Foernamn + " " + deltagaren.Efternamn
ws.cell(row=deltagarenRow, column=8).value = 'K' if deltagaren.IsFemale() else 'M'
ws.cell(row=deltagarenRow, column=9).value = deltagaren.Postnummer
ws.cell(row=deltagarenRow, column=10).value = deltagaren.Personnummer[0:8]
ws.cell(row=deltagarenRow, column=2).value = deltagaren.foernamn + " " + deltagaren.efternamn
ws.cell(row=deltagarenRow, column=8).value = 'K' if deltagaren.is_female() else 'M'
ws.cell(row=deltagarenRow, column=9).value = deltagaren.postnummer
ws.cell(row=deltagarenRow, column=10).value = deltagaren.personnummer[0:8]

for index, ledaren in enumerate(self.dak.kort.ledare):
ledarenRow = startRowPersons+index+deltagareCount
ws.cell(row=ledarenRow, column=2).value = "Ledare:"
ws.cell(row=ledarenRow, column=3).value = ledaren.Foernamn + " " + ledaren.Efternamn
ws.cell(row=ledarenRow, column=8).value = 'K' if ledaren.IsFemale() else 'M'
ws.cell(row=ledarenRow, column=9).value = ledaren.Postnummer
ws.cell(row=ledarenRow, column=10).value = ledaren.Personnummer[0:8]
ws.cell(row=ledarenRow, column=3).value = ledaren.foernamn + " " + ledaren.efternamn
ws.cell(row=ledarenRow, column=8).value = 'K' if ledaren.is_female() else 'M'
ws.cell(row=ledarenRow, column=9).value = ledaren.postnummer
ws.cell(row=ledarenRow, column=10).value = ledaren.personnummer[0:8]

bytesIO = io.BytesIO()
workbook.save(bytesIO)
Expand Down
10 changes: 5 additions & 5 deletions ireport.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
class IReport:
class IReport(object):
"""Interface for attendence reports"""
def __init__(self, dak, semester):
pass

def getUrlName(self):
def get_url_anme(self):
"""Short name that can be used as a url parameter"""
pass

def getMimeType(self):
def get_mime_type(self):
"""Mime type for this data format."""
pass

def getFilename(self):
def get_filename(self):
"""Returns a filename for this report."""
pass

def getReportString(self):
def get_report_string(self):
"""File content data from export."""
pass
65 changes: 9 additions & 56 deletions jsonreport.py
Original file line number Diff line number Diff line change
@@ -1,71 +1,24 @@
# -*- coding: utf-8 -*-

if __name__ == '__main__':
import sys
sys.path.append('lib') # add lib to path for unit-testing
import json

import jsonpickle
import unittest
import datetime
from dakdata import DakData, Deltagare, Sammankomst
from ireport import IReport


class JsonReport(IReport):
def __init__(self, dak, semester):
super(JsonReport, self).__init__(dak, semester)
self.dak = dak
self.semester = semester

def getUrlName(self):
def get_url_anme(self):
return "json"

def getMimeType(self):
def get_mime_type(self):
return "text/json"

def getReportString(self):
return self.getJson()

def getFilename(self):
return str(self.dak.kort.NamnPaaKort) + '-' + self.semester.getname() + '.json'

def getJson(self):
return jsonpickle.encode(self.dak)


class TestJsonReport(unittest.TestCase):
def createDakData(self):
dak = DakData()
dak.foereningsNamn = u"Test Scoutkår"
dak.foreningsID = "1111"
dak.organisationsnummer = "556677-8899"
dak.kommunID = "0"
dak.kort.NamnPaaKort = "Testavdelning"
dak.kort.NaervarokortNummer = "1"
#
dak.kort.ledare.append(Deltagare("1234", "Adam", "Adamsson", "200501011234", True, "[email protected]", "12345678", u"Göteborg"))
dak.kort.deltagare.append(Deltagare("1235", "Bertil", "Bertilsson", "198501011234", False, "[email protected]", "12345678", u"Göteborg"))
sammankomst = Sammankomst(u"123", datetime.date(2019, 1, 1), 180, u"Möte")
sammankomst.ledare.append(dak.kort.ledare[0])
sammankomst.deltagare.append(dak.kort.deltagare[0])
dak.kort.Sammankomster.append(sammankomst)
return dak

def test_dakexport(self):
dak = self.createDakData()
#semester = Semester(2019, false) # 2019, vt
semester = None
json_report = JsonReport(dak, semester)
stream = json_report.getReportString()
#print(stream)
data = json.loads(stream)

self.assertEqual(data[u'foereningsNamn'], u"Test Scoutkår")
self.assertEqual(data[u'foreningsID'], u"1111")
self.assertEqual(data[u'kort'][u'NamnPaaKort'], "Testavdelning")
self.assertEqual(data[u'kort'][u'Sammankomster'][0]['deltagare'][0]['id'], "1235")
self.assertEqual(data[u'kort'][u'Sammankomster'][0]['ledare'][0]['id'], "1234")
def get_report_string(self):
return self.get_json()

def get_filename(self):
return str(self.dak.kort.namn_paa_kort) + '-' + self.semester.getname() + '.json'

if __name__ == '__main__':
unittest.main()
def get_json(self, unpicklable=True, warn=False):
return jsonpickle.encode(self.dak, unpicklable=unpicklable, warn=warn)
Loading