Giter Site home page Giter Site logo

scouterna / skojjt Goto Github PK

View Code? Open in Web Editor NEW
14.0 10.0 15.0 9.75 MB

Närvarorapportering för scouter

License: Apache License 2.0

Python 28.43% CSS 0.09% JavaScript 61.83% HTML 8.98% TypeScript 0.15% Batchfile 0.52%
gae scoutnet scouting google-app-engine

skojjt's Introduction

Skojjt

Närvarorapportering för scouter.

av Martin Green/Tynnereds scoutkår.

https://skojjt.appspot.com
Prova skojjt.appspot.com, säg till [email protected] för att få access.

Målet med skojjt är en enkel närvaroregistrering som kan används av alla på avdelning. Alternativen verkar så undermåliga för vår verksamhet, så ett eget system var den bästa möjligheten. Man ska kunna göra sin registering direkt när man har mötet. Det finns en direktkoppling till vårt eget medlemsregister, scoutnet. Vi kan synkronisera nya medlemmar direkt från scoutnet med en knapptryckning. Det är en web-site som fungerar i mobiltelefon, inget behov av en app. Det ser ut som en app i telefonens browser. Den hostas på Google app engine. Vilket ger följande fördelar:

  • Google står för säkerheten. Användarna loggar in med sina google konton. Administratören sätter access i skojjt, sen kan dom registrera.
  • Google står för SSL certifikatet. All trafik går via https.
  • Driftsäkerheten är god.
  • Det är gratis upp till en viss gräns för trafik och datamängd.
  • Om det skulle bli många användare så klarar googles servrar det.

Det finns rapportering av närvaro per grupp (avdelning) som Göteborgs kommun kräver. Vi har även möjlighet att koppla denna närvaro till andra partners, t ex Sensus studieförbund.

Skojjt implementerar APN/DAK för redovisning till Göteborgs kommun:

Hur man testar/utvecklar i Windows:

Windows stöds inte längre. Använd Windows Subsystem For Linux (WSL)

Hur man testar/utvecklar i Linux:

  • Klona git-repon till lokal dator.
  • Installera Python 3.11
  • Google Cloud CLI.
  • Skapa en virtual env med Python 3.11: /usr/bin/python3.11 -m venv env
  • Aktivera virtual env: source ./env/bin/activate
  • Installera biblioteken. pip install -r requirements.txt
  • Konfigurera GAE gcloud init och följ instruktionerna.
  • Deploy kod gcloud app deploy från git mappen
  • Update indexesgcloud datastore indexes create index.yaml
  • Testa appen gcloud app browse
  • Installera datastor emulator: sudo apt-get install default-jre google-cloud-sdk-datastore-emulator

Hur man testar/utvecklar på Mac:

  • Använd homebrew för att installera Python 2.7 och Google App Engine.
    • Installera homebrew om inte redan gjort
    • Installera python2 i homebrew
    • Installera Google App Engine (ligger i en cask eftersom den är binär)
      • brew cask info google-cloud-sdk
      • brew tap caskroom/cask
      • brew cask install google-cloud-sdk
      • source /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc
      • source /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc
  • Konfigurera GAE gcloud init
  • Kör lokal test-server och admin fönster:
    • dev_appserver.py app.yaml
    • open http://localhost:8080
  • Deploy projektet skojjt-X(ditt val av namn)
    • gcloud app deploy index.yaml --project skojjt-X
    • gcloud app deploy app.yaml --project skojjt-X
  • Testa appen gcloud app browse

Continuous deployment

Senaste versionen från grenen GAE/master finns tillgänglig på https://skojjt.appengine-staging.scouterna.net för testning.

skojjt's People

Contributors

benganellison avatar dependabot[bot] avatar hakankvist avatar kallemooo avatar kesse avatar martin-green avatar mrmanner avatar odecif avatar puggan avatar stalar avatar stefer avatar tobbee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

skojjt's Issues

Problem med import htmlform

Hej,

För följande fel när jag deployar den senaste koden till google cloud

Traceback (most recent call last): File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle handler = _config_handle.add_wsgi_middleware(self._LoadHandler()) File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler handler, path, err = LoadObject(self._handler) File "/google/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject obj = __import__(path[0]) File "/home/hesse2u/default/main.py", line 8, in <module> import htmlform ImportError: No module named htmlform

Hur installerar jag htmlform?

Fel lägga till ledare

Jag får "sidan kan ej" hittas när jag försöker göra en person till ledare, testa ex Malte, Hans eller Jonas i Tors Sjöfåglar.

Skicka email med info när man lägger till person i skojjt

Om man lägger till någon i skojjt så hamnar dom i "medlemmar som inte godkänts" i scoutnet.
Det är viktigt att man går in i scoutnet och godkänner, sätter avgift, avdelning och patrull.
Skojjt borde skicka det i ett email till den som lägger till en person.

Rensa gammalt data

En funktion för att kunna rensa bort gamla terminers data för en kår.
Användare som inte längre finns i scoutnet plockas bort på samma gång.

Kåren har frågat om hur man plockar bort de som inte är medlemmar längre,
men som jag ser det måste de finnas kvar så länge det finns data kopplat till dem.

Ett alternativ är att man anonymiserar dem när de inte längre finns i scoutnet,
så att man tex behåller scoutnets id, men nollställer alla andra fält.

TemplateNotFound: troops.html

Hej,

Verkar som filen troops.html inte har checkats in i samband med commit 324da73 4 december.

Får följande stacktrace när jag kör koden:

Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in Handle result = handler(dict(self._environ), self._StartResponse) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1836, in __call__ return self.wsgi_app(environ, start_response) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1820, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1403, in handle_exception reraise(exc_type, exc_value, tb) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1817, in wsgi_app response = self.full_dispatch_request() File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1477, in full_dispatch_request rv = self.handle_user_exception(e) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1381, in handle_user_exception reraise(exc_type, exc_value, tb) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1475, in full_dispatch_request rv = self.dispatch_request() File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/app.py", line 1461, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/main.py", line 255, in start breadcrumbs=breadcrumbs) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/templating.py", line 127, in render_template return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list), File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/jinja2/environment.py", line 851, in get_or_select_template return self.get_template(template_name_or_list, parent, globals) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/jinja2/environment.py", line 812, in get_template return self._load_template(name, self.make_globals(globals)) File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/jinja2/environment.py", line 774, in _load_template cache_key = self.loader.get_source(self, name)[1] File "/base/data/home/apps/e~gotalejon-narvaro/20170116t224124.398520058533917472/lib/flask/templating.py", line 64, in get_source raise TemplateNotFound(template) TemplateNotFound: troops.html

Medlem importeras inte in från Scoutnet

Hur jag än försöker justera medlemsuppgifter i Scoutnet för att Skojjt ska "reagera" så "ser" importen inte scouten. Tips på vad jag kan göra, förutom att registrera scouten manuellt i Skojjt? Alltså funktionen lägga till person hittar alla i kåren utom denna scout. Och om jag registrerar en person i Skojjt, som redan finns i Scoutnet, vilka aber kan jag springa på då? Vad behöver ni av mig för att kunna göra en felsökning?

Importera async

Import från scoutnet ska göras i ett bakgrundsjobb. Annars riskerar man timeout efter en minut.

Stor avdelning med 2 mötestider samma dag.

Med ändringarna från ba9e757, så ser det ut som att vår spåraravdelning, inte längre kan rapportera in som de gjort hitils.

Mötet är uppdelar i 2 delar, en mellan 18-19, och en mellan 19-20, hitils har de lagts in som 2 möten på samma dag, och rapporterats separat.

Lösningen på problemet är kanske inte kod-relaterat, utan kanske administrativt, en variant är ju att rapportera in alla barn på samma möte, men de ger ju fel tid för hälften av barnen,
ett annat alternativ är att de kanske ska ligga som 2 olika avdelningar i skojjt, eller kanske rent av 2 olika avdelningar i scoutnet.

Du som vet hur xml-filerna blir, kanske har lite feedback på vad som är lämpligast, så tar jag upp det med kåren.

screenshot_20170127_081513

Föreningsredovisning

För att få söka aktivitetsbidrag i gbg måste man göra en föreningsredovisning.
Det är en summering av antal medlemmar per ålder och kön.

Man ska även rapportera antal kvinnor och män i styrelsen.
Eftersom den informationen inte kommer från sn-api, så får vi kryssa i det i skojjt.

Begränsa access till kår

Lägg till en lista på kårer i UserPrefs, bara de kårer som finns i den listan visas. Om listan är tom visas alla.
Om man bara har en kår kan man hoppa över sidan med Kårer vid Närvaroregistrering och gå direkt till avdelningar.

Terminshantering

Man behöver kunna välja termin så att man kan ha flera i databasen. En för rapportering till kommunen och en aktiv där avdelningarna rapporterar närvaro.

Önskemål om att på personsidan visa uppgifter till anhörig1 & 2

Det vore önskvärt att kunna visa anhörig1 och 2:s namn och kontaktuppgifter på personsidorna (när man trycker på ett namn i närvarolistan).

Den e-post som registreras i scoutnet i e-postfältet (primär e-postadress) är ju den som är tänkt att vara personlig till scouten, från början oftast en av föräldrarna, när de sedan blir äldre byts den ofta till en personlig, framförallt för att de ska kunna logga in i scoutnet själva (det uppstår också problem här om en förälder blir scoutledare och barnen till denne har förälderns e-postadress som primär e-postadress), men vi vill ju oftast ha kvar kontaktuppgifterna till vårdnadshavarna, i alla fall tills de fyllt 18 år.

Refaktorera main.py

main.py har blivit alldeles för stor, över 1100 rader.

Två sätt att dela upp den:

  • Per route-grupp
  • Bryta ut funktionalitet till egna klasser

Jag föreslår att dela upp den per route-grupp först, dvs skapa filerna

  • start.py
  • persons.py
  • scoutgroupinfo.py
  • import.py
  • admin.py
  • tasks.py

Eftersom jag är nybörjare på python, flask och google app engine, så vet jag inte hur man skall göra i detalj.

Unsaved changes discard when addin a person

Reproduce:

  1. Star mark the person that was attending
  2. Notice someone is missing in the list
  3. Search upp and add that person

Expected Result:
The table was extended with one person
and you can continue to mark off the rest of the list

Current result:
The table was extended with one person
and all marks get unchecked, so you need to start over.

Alternative expected result.
Dialog like 'You have unsaved changes, save them before continue?'

Sensus timmar per möte

I sensuslistan ska summeringen av timmar bara vara pet möte inte multiplicerat med antalet närvarande.

Skapa sensus närvarolista

Man vill kunna generera en närvarolista för Sensus från en pdf mall (se bifogad). Mallen kan behöva expanderas med fler möten (30 st). En lösning är att göra en html mall som ser ut som formuläret och sen generera pdf med xhtml2pdf och Jinja: Exempel
Man behöver kunna dela in avdelningen i flera grupper så att man kan få bidrag för varje grupp separat. Varje grupp behöver minst en ledare, och minst två deltagare.
sensus_template.pdf
Rapporten kan sedan laddas hem som en ifylld pdf, skrivas ut, signeras, och skickas till Sensus.

(Om Sensus hade haft ett vettigt API hade vi kunnat använda det.)

Skapa rapporter

Det vore önskvärt att i scoutnet registrerade ledare (eller i Skojjt registrerade ledare eller alla användare ac Skojjt) kan 'skapa rapporter' för redovisning av närvaro till kommun samt Sensus. Som det är nu är denna funktion förbehållen endast adminsitratörer.

Refaktorera start-metoden

Start-metoden i main.js är komplex att underhålla för att den är så stor (närmare 500 rader).

Den borde kunna brytas upp.

Den har åtminstone fyra stora olika funktioner:

  • /start startsidan där alla kårer man får se visas
  • /start/<sgroup_url> för kåren där avdelningarna visas
  • /start/<sgroup_url>/troop_url för avdelningen där mötesredovisningen sker
  • /start/<sgroup_url>/troop_url/key_url med flera funktioner för en avdelning

Om jag förstår flask rätt, så borde man kunna ha varsin funktion för var och en av dessa.
Visst, det blir lite gemensam kod som måste återupprepas i vardera (hämta user/kår/avdelnings-info)
men jag tror ändå det blir tydligare.

Möjligen kan man tom dela upp /start/<sgroup_url>/troop_url/key_url per key (settings, delete, newperson, dak, sensus)

Skapa avdelning i skojjt

Det kan vara bra att skapa en lokal avdelning i skojjt som inte finns i scoutnet. Det är användbart för läger redovisning, speciellt om scouterna har bytt avdelning efter sommarlägret.

Frånvaro <<|>> Närvaro-toggle-knapp

Oftast så är det lättare att säga vilka som inte är närvarande, dvs frånvarande. Det är lite mödosamt ibland att behöva markera alla som är där. Istället vore det smidigare om man kunde (invertera frågan och) markera endast de som är frånvarande. Alltså istället för att markera 30 st närvarande, klicka på en liten knapp längst upp i listan som gör närvarolistan till frånvarolista, och nu markera endast 2 frånvarande.

Det enda som är skillnaden mellan lägena är hur datat presenteras i UI. Man kan när som helst klicka på knappen för att växla mellan lägena.

Trimma input för import

Man kan få med space i API strängen när man klistrar in den i formuläret.
Kör en .trim på strängen. Gäller även kårid.

Kommer/kommer inte

Det är ibland bra att veta hur många som kommer på ett möte.
Då kan man:

  1. skapa det framtida mötet
  2. skicka ut en fråga till alla avdelningsmedlemmar om dom kommer, via epost. Två länkar i emailet: Ja/Nej.
  3. i skojjt kan man färgmarkera runt kryssrutan, grönt/rött (eller annan symbol).

GAE har begränsning på 100 epost/dygn, så en extern mail-lösning blir nödvändig.

Efternamnet klips av

Om en person har dubbla efternamn, så klipper den av dem mitt i andra efternamnet, efter 10 bokstäver.

Varför en maxlängd på 10?

och vad ska pattern delen göra? om den ska bara visa första efternamnet så funkar den inte, ska antagligen vara re.compile("[\( -]")

		pattern = re.compile("\( -")
		fn = self.firstname #pattern.split(self.firstname)[0][:10]
		ln = pattern.split(self.lastname)[0][:10]

Möjligt skapa dublettmöte - närvaron försvinner

Anta att man skapat ett möte och fört in närvaro. Om man sedan av misstag skapar ett nytt möte den dagen (kollade inte om det går att skapa med annan tid), då skriver det över närvarodatan dvs. man förlorar närvaroregistreringen.

Problem att importera personer utan personnummer

Misstänker att nedan ställer till det för personer utan personnummer. Har inte testkört ändringar ännu. Det är alltså möjligt för det äldre gardet att vara reggade i scoutnet utan personnummer, föreslår att importen helt enkelt hoppar över dessa.

## dataimport.py / 151-153
if person == None:
  id = p["personnr"].replace('-', '')
  person = Person.get_by_id(id, use_memcache=True) # attempt to find using personnr, created as a local person

Det faktiska felmeddelandet:

Importfel: Key path element must not be incomplete: [Person: ]

Läsa in från Scoutnet

Det vore önskvärt att alla ledare (eller användare) kan läsa in uppgifter från Scoutnet till Skojjt. I dagsläget är denna funktion lagd som en administratörsfunktion.

Importera för tidigare termin

Nu väljer skojjt termin beroende på aktuellt datum. Lägg till en väljare för termin så att man kan importera för föregående termin.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.