From e4e275b729eebf0899fa548dbbe84a3c86a965ec Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 18 Oct 2024 13:01:22 +0300 Subject: [PATCH 01/51] Use print function from __future__ This will ease migration to Python 3. --- web/tupa/logger.py | 4 ++-- web/tupa/tests.py | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/web/tupa/logger.py b/web/tupa/logger.py index d0d66a71..3a06ec1f 100644 --- a/web/tupa/logger.py +++ b/web/tupa/logger.py @@ -2,7 +2,7 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi - +from __future__ import print_function from django.conf import settings from xml.dom.minidom import parse, parseString import os.path @@ -56,7 +56,7 @@ def process_request(self, request): if not kisa_haku.group(1) == "uusiKisa": kisa = Kisa.objects.get(nimi=kisa_haku.group(1)) vanha = kisa_xml(kisa) - print vanha + print(vanha) uusi.write(kisa_xml(kisa)) # talletetaan kisan kanta pohjaksi else: uusi.write( diff --git a/web/tupa/tests.py b/web/tupa/tests.py index b8a02ab5..b2b5f5fd 100644 --- a/web/tupa/tests.py +++ b/web/tupa/tests.py @@ -2,6 +2,7 @@ # KiPa(KisaPalvelu), tuloslaskentaj�rjestelm� partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi +from __future__ import print_function import unittest from models import * @@ -407,25 +408,25 @@ def run_one_fixture(test_labels, verbosity=1, interactive=True, extra_tests=[]): # print test_labels[0] # Jos testilabeliksi asetettu 'kisat', käytetään kisat-kansiota if test_labels[0] == "kisat": - print "\n***Ajetaan kisa fixtuurit***\n" + print("\n***Ajetaan kisa fixtuurit***\n") test_fixtures = [] test_labels = "" for f in os.listdir(os.curdir + "/fixtures/tests/kisat/"): if not f.find(".xml") == -1: - print ("Löytyi: %s\n" % f) + print("Löytyi: %s\n" % f) test_fixtures.append("fixtures/tests/kisat/" + f) sys.stdout.flush() # print ('Testataan fixtuurit: %s\n' %test_fixtures) # Jos testilabeliksi asetettu 'perus' ajetaan ainoastaan fixtures kansiosta löytyvät testit elif test_labels[0] == "perus": - print "\n***Ajetaan perusfixtuurit***\n" + print("\n***Ajetaan perusfixtuurit***\n") test_fixtures = [] for f in os.listdir(os.curdir + "/fixtures/tests/"): if not f.find(".xml") == -1: - print ("Löytyi: %s\n" % f) + print("Löytyi: %s\n" % f) test_fixtures.append("fixtures/tests/" + f) sys.stdout.flush() @@ -433,8 +434,8 @@ def run_one_fixture(test_labels, verbosity=1, interactive=True, extra_tests=[]): # ajettavaksi haluttu yksittäinen fixtuuri else: # Ajetaan vain yksi, annettu fixtuuri - print "\n***Ajetaan yksi fixtuuri***\n" - print ("%s.xml\n" % test_labels[0]) + print("\n***Ajetaan yksi fixtuuri***\n") + print("%s.xml\n" % test_labels[0]) test_fixtures = [] test_fixtures.extend(test_labels) for item in range(len(test_fixtures)): @@ -453,20 +454,20 @@ def run_one_fixture(test_labels, verbosity=1, interactive=True, extra_tests=[]): else: # Testeissä käytettävät fixturet: # haetaan kaikki xml fixtuurien nimet. - print "\n***Ajetaan kaikki testifixtuurit***\n" + print("\n***Ajetaan kaikki testifixtuurit***\n") test_fixtures = [] - print "\n***Ajetaan perusfixtuurit***\n" + print("\n***Ajetaan perusfixtuurit***\n") for f in os.listdir(os.curdir + "/fixtures/tests/"): if not f.find(".xml") == -1: - print ("Löytyi: %s\n" % f) + print("Löytyi: %s\n" % f) test_fixtures.append("fixtures/tests/" + f) sys.stdout.flush() - print "\n***Ajetaan kisa fixtuurit***\n" + print("\n***Ajetaan kisa fixtuurit***\n") test_labels = "" for f in os.listdir(os.curdir + "/fixtures/tests/kisat/"): if not f.find(".xml") == -1: - print ("Löytyi: %s\n" % f) + print("Löytyi: %s\n" % f) test_fixtures.append("fixtures/tests/kisat/" + f) sys.stdout.flush() From 6b4c4344acb15bfc7d747f7f5f51aa7f08a01906 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 22 Oct 2024 17:12:57 +0300 Subject: [PATCH 02/51] Remove python shebangs Kipa is not ran as a script. --- .github/workflows/continuous-integration.yml | 2 +- Dockerfile | 2 +- web/manage.py | 2 -- web/tupa/formit.py | 1 - web/tupa/models.py | 3 --- web/tupa/views.py | 1 - 6 files changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index e258fff0..9c2b17b3 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -29,7 +29,7 @@ jobs: - name: start SUT run: docker compose up --quiet-pull --detach --build - name: run django test - run: docker compose run web './manage.py' test --failfast + run: docker compose run web python './manage.py' test --failfast robot-tests: runs-on: ubuntu-latest timeout-minutes: 15 diff --git a/Dockerfile b/Dockerfile index 64e65340..66addab6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /app/web RUN echo "PYTHONPATH=/usr/local/lib/python2.7/site-packages" | tee -a /etc/profile ENTRYPOINT ["/app/docker-entrypoint.sh"] EXPOSE 3000 -CMD ["./manage.py", "runserver", "0.0.0.0:3000"] +CMD ["python", "./manage.py", "runserver", "0.0.0.0:3000"] COPY . /app/ COPY web/settings/docker.py.example /app/web/settings/docker.py diff --git a/web/manage.py b/web/manage.py index 339a88f4..b206fa0f 100755 --- a/web/manage.py +++ b/web/manage.py @@ -1,5 +1,3 @@ -#!/usr/bin/python2 - import os import sys diff --git a/web/tupa/formit.py b/web/tupa/formit.py index 4dc73ec9..23556469 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -3,7 +3,6 @@ # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -#!/usr/bin/python # -*- coding: utf-8 -*- from django.forms.models import modelformset_factory diff --git a/web/tupa/models.py b/web/tupa/models.py index a3710c3c..cc1150d6 100644 --- a/web/tupa/models.py +++ b/web/tupa/models.py @@ -3,9 +3,6 @@ # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -#!/usr/bin/python - - from django.db import models from random import uniform from TulosLaskin import * diff --git a/web/tupa/views.py b/web/tupa/views.py index 048d2c70..7080aeaa 100644 --- a/web/tupa/views.py +++ b/web/tupa/views.py @@ -2,7 +2,6 @@ # coding: UTF-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2011 Espoon Partiotuki ry. ept@partio.fi -#!/usr/bin/env python # -*- coding: UTF-8 -*- from django.shortcuts import render_to_response, redirect, get_object_or_404 From 4a58b3c3cb863d0111d204c01d7d3f05a7db9b92 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 22 Oct 2024 17:33:26 +0300 Subject: [PATCH 03/51] Use only linefeeds in codebase This removes rest of carriage returns from python and template files. Also removes trailing spaces which weren't removed in 54c1c73c606545b05dd3e762eecec583b84ffad0 because of carriage returns was not taken in account. --- web/templates/tupa/heijasta.html | 444 +++++++++++++------------- web/templates/tupa/tuomarineuvos.html | 62 ++-- web/tupa/log.py | 188 +++++------ 3 files changed, 347 insertions(+), 347 deletions(-) diff --git a/web/templates/tupa/heijasta.html b/web/templates/tupa/heijasta.html index 9c77f880..7252d9df 100644 --- a/web/templates/tupa/heijasta.html +++ b/web/templates/tupa/heijasta.html @@ -1,222 +1,222 @@ - - - -{% block header %} -{% if vaihtoaika %} - -{% endif %} -{% endblock header %} -Sarjakohtaiset tulokset - - - - - - -{% load kipatags %} - - - - - - - - - - - - -

{{kisa_nimi|alaviiva_pois}}

{{heading}}

 
{%if kisa_aika %} - {{kisa_aika}}
- {% endif %} - {{kisa_paikka}} -
{% now "j.n.Y G:i"%} 
- -{% if tulos_taulukko %} - - {% for rivi in tulos_taulukko%} - {%if forloop.counter|add:"3"|divisibleby:"5" %} - - {% endif %} - {% if forloop.first %} - - {% for sarake in rivi %} - {% comment %} ylarivi {% endcomment %} - {% if forloop.first %} - {% comment %} ylarivin eka {% endcomment %} - - - - - {% else %} - {% comment %} ylarivi {% endcomment %} - - {% if sarake.jarjestysnro %} - - {% endif %} - {% endif %} - {% endfor %} - - - - - - {% for sarake in rivi %} - {% comment %} ylarivi {% endcomment %} - {% if forloop.first %} - {% comment %} ylarivin eka {% endcomment %} - - {% else %} - {% comment %} ylarivi {% endcomment %} - {%if sarake.lyhenne %} - - {% else %} - - {% endif %} - {% endif %} - {%endfor %} - - - - - {% for sarake in rivi %} - {% if forloop.first %} - - {% else %} - - {% ifnotequal forloop.counter 0 %} - {% ifnotequal forloop.counter 1 %} - {% ifnotequal forloop.counter 2 %} - - {% endifnotequal %} - {% endifnotequal %} - {% endifnotequal %} - {% endif %} - - {%endfor %} - - - - - - - - - - - {% else %} - {% for sarake in rivi %} - {% comment %} ylarivi {% endcomment %} - {% ifequal forloop.counter 2 %} - {% comment %} ekasarake {% endcomment %} - - {% else %} - {% ifequal forloop.counter 3 %} - - {% comment %} muut sarakkeet {% endcomment %} - {% else %} - - {% endifequal %} - {% endifequal %} - - {% endfor %} - {% endif %} - - {% comment %} ULKONA OLEVAT: {% endcomment %} - {% if forloop.last %} - - - {% for rivi in ulkona_taulukko%} - - {% for sarake in rivi %} - - - {% ifequal forloop.counter 2 %} - {% comment %} ekasarake {% endcomment %} - - - {% else %} - {% comment %} muut sarakkeet {% endcomment %} - - {% endifequal %} - {% endfor %} - - {%if forloop.counter|divisibleby:"5" %} - - {% endif %} - {% endfor %} - {% endif %} - {% endfor %} - - -
-
- - - -
- {{ sarake.jarjestysnro }}. -
{{sarake.lyhenne}} - {{sarake.nimi|slice:":6"}}
- {{sarake.nimi|slice:"6:13"}}
- {{sarake.nimi|slice:"13:19"}}
- {{sarake.nimi|slice:"19:25"}}
-
Maxpisteet {{ sarake.maksimipisteet }} {{ sarake.maksimipisteet }}
SIJ.VARTIOYHT
{{ sarake.nro }} {{sarake.nimi}} - {%if sarake.lippukunta %}
{%endif%} - {{sarake.lippukunta}} - {%if sarake.piiri %}
{%endif%} - {{sarake.piiri}}
{{sarake}} - {% if forloop.first %} {%endif%} - {{ sarake }} - {% if forloop.first %} {%endif%} -
 
Ulkopuolella:
{{ sarake.nro }} {{ sarake.nimi }} - {%if sarake.lippukunta %}
{%endif%} - {{sarake.lippukunta}} - {%if sarake.piiri %}
{%endif%} - {{sarake.piiri}}
- {% if forloop.first %} {%endif%} - {{ sarake }} - {% if forloop.first %} {%endif%} -
- -{% else %} -

Ei tuloksia.

-{% endif %} - -

- S = syöttämättä
- H = vartion suoritus hylätty
- K = vartio keskeyttänyt
- E = vartio ei ole tehnyt tehtävää
- ! = vartion sijaluku laskettu tasapisteissä määräävien tehtävien perusteella
-
- -

-

Takaisin etusivulle

- - - - + + + +{% block header %} +{% if vaihtoaika %} + +{% endif %} +{% endblock header %} +Sarjakohtaiset tulokset + + + + + + +{% load kipatags %} + + + + + + + + + + + + +

{{kisa_nimi|alaviiva_pois}}

{{heading}}

 
{%if kisa_aika %} + {{kisa_aika}}
+ {% endif %} + {{kisa_paikka}} +
{% now "j.n.Y G:i"%} 
+ +{% if tulos_taulukko %} + + {% for rivi in tulos_taulukko%} + {%if forloop.counter|add:"3"|divisibleby:"5" %} + + {% endif %} + {% if forloop.first %} + + {% for sarake in rivi %} + {% comment %} ylarivi {% endcomment %} + {% if forloop.first %} + {% comment %} ylarivin eka {% endcomment %} + + + + + {% else %} + {% comment %} ylarivi {% endcomment %} + + {% if sarake.jarjestysnro %} + + {% endif %} + {% endif %} + {% endfor %} + + + + + + {% for sarake in rivi %} + {% comment %} ylarivi {% endcomment %} + {% if forloop.first %} + {% comment %} ylarivin eka {% endcomment %} + + {% else %} + {% comment %} ylarivi {% endcomment %} + {%if sarake.lyhenne %} + + {% else %} + + {% endif %} + {% endif %} + {%endfor %} + + + + + {% for sarake in rivi %} + {% if forloop.first %} + + {% else %} + + {% ifnotequal forloop.counter 0 %} + {% ifnotequal forloop.counter 1 %} + {% ifnotequal forloop.counter 2 %} + + {% endifnotequal %} + {% endifnotequal %} + {% endifnotequal %} + {% endif %} + + {%endfor %} + + + + + + + + + + + {% else %} + {% for sarake in rivi %} + {% comment %} ylarivi {% endcomment %} + {% ifequal forloop.counter 2 %} + {% comment %} ekasarake {% endcomment %} + + {% else %} + {% ifequal forloop.counter 3 %} + + {% comment %} muut sarakkeet {% endcomment %} + {% else %} + + {% endifequal %} + {% endifequal %} + + {% endfor %} + {% endif %} + + {% comment %} ULKONA OLEVAT: {% endcomment %} + {% if forloop.last %} + + + {% for rivi in ulkona_taulukko%} + + {% for sarake in rivi %} + + + {% ifequal forloop.counter 2 %} + {% comment %} ekasarake {% endcomment %} + + + {% else %} + {% comment %} muut sarakkeet {% endcomment %} + + {% endifequal %} + {% endfor %} + + {%if forloop.counter|divisibleby:"5" %} + + {% endif %} + {% endfor %} + {% endif %} + {% endfor %} + + +
+
+ + + +
+ {{ sarake.jarjestysnro }}. +
{{sarake.lyhenne}} + {{sarake.nimi|slice:":6"}}
+ {{sarake.nimi|slice:"6:13"}}
+ {{sarake.nimi|slice:"13:19"}}
+ {{sarake.nimi|slice:"19:25"}}
+
Maxpisteet {{ sarake.maksimipisteet }} {{ sarake.maksimipisteet }}
SIJ.VARTIOYHT
{{ sarake.nro }} {{sarake.nimi}} + {%if sarake.lippukunta %}
{%endif%} + {{sarake.lippukunta}} + {%if sarake.piiri %}
{%endif%} + {{sarake.piiri}}
{{sarake}} + {% if forloop.first %} {%endif%} + {{ sarake }} + {% if forloop.first %} {%endif%} +
 
Ulkopuolella:
{{ sarake.nro }} {{ sarake.nimi }} + {%if sarake.lippukunta %}
{%endif%} + {{sarake.lippukunta}} + {%if sarake.piiri %}
{%endif%} + {{sarake.piiri}}
+ {% if forloop.first %} {%endif%} + {{ sarake }} + {% if forloop.first %} {%endif%} +
+ +{% else %} +

Ei tuloksia.

+{% endif %} + +

+ S = syöttämättä
+ H = vartion suoritus hylätty
+ K = vartio keskeyttänyt
+ E = vartio ei ole tehnyt tehtävää
+ ! = vartion sijaluku laskettu tasapisteissä määräävien tehtävien perusteella
+
+ +

+

Takaisin etusivulle

+ + + + diff --git a/web/templates/tupa/tuomarineuvos.html b/web/templates/tupa/tuomarineuvos.html index 97a1a11e..1c4106b5 100644 --- a/web/templates/tupa/tuomarineuvos.html +++ b/web/templates/tupa/tuomarineuvos.html @@ -1,31 +1,31 @@ -{% extends "tupa/valitse.html" %} - -{% load kipatags %} - -{% block sarake %} - - - - {% for kentta in sarake.tiedot.0.tehtavat %} - - {% endfor %} - - {% for rivi in sarake.tiedot %} - - - {% for kentta in rivi.formit%} - - {% endfor %} - - {% endfor %} -
- {{ kentta.nimi|alaviiva_pois }} -
{{rivi.nimi}}{{ kentta }}{{kentta.errors}}
-{% endblock%} -{% block content %} -
- {{ block.super }} - {% include "tupa/tallenna.html" %} -{% endblock%} -
- +{% extends "tupa/valitse.html" %} + +{% load kipatags %} + +{% block sarake %} + + + + {% for kentta in sarake.tiedot.0.tehtavat %} + + {% endfor %} + + {% for rivi in sarake.tiedot %} + + + {% for kentta in rivi.formit%} + + {% endfor %} + + {% endfor %} +
+ {{ kentta.nimi|alaviiva_pois }} +
{{rivi.nimi}}{{ kentta }}{{kentta.errors}}
+{% endblock%} +{% block content %} +
+ {{ block.super }} + {% include "tupa/tallenna.html" %} +{% endblock%} +
+ diff --git a/web/tupa/log.py b/web/tupa/log.py index 76685b77..50ffcb7b 100644 --- a/web/tupa/log.py +++ b/web/tupa/log.py @@ -1,94 +1,94 @@ -import settings - -laskentaloki = "" -try: - stack -except: - stack = [] - - -def __noLogString(string): - return None - - -def __logString(string): - string = string.replace("\n", "
") - string = string.replace(" ", " ") - global laskentaloki - laskentaloki += string + "
" - - -def __noLogFunction(function, params, result): - return None - - -def __logFunction(function, params, result): - global laskentaloki - if params: - - laskentaloki += "
" - laskentaloki += unicode(function.__name__) + "(" - try: - for p in params: - laskentaloki += unicode(p) + ", " - except: - pass - laskentaloki = laskentaloki[:-2] - laskentaloki += ")=
" + unicode(result) - laskentaloki += "" - laskentaloki += "
" - - -def enableLogging(): - global logString - global logFunction - logString = __logString - logFunction = __logFunction - - -def disableLogging(): - global logString - global logFunction - logString = __noLogString - logFunction = __noLogFunction - - -def muteLogging(): - global stack - global logString - global logFunction - stack.append(logString) - stack.append(logFunction) - disableLogging() - - -def unmuteLogging(): - global stack - global logString - global logFunction - logFunction = stack.pop() - logString = stack.pop() - - -def clearLoki(): - global laskentaloki - laskentaloki = "" - - -def palautaLoki(): - global laskentaloki - return laskentaloki - - -try: - logString -except: - logString = None - -try: - logFunction -except: - logFunction = None - -if not logString or not logFunction: - enableLogging() +import settings + +laskentaloki = "" +try: + stack +except: + stack = [] + + +def __noLogString(string): + return None + + +def __logString(string): + string = string.replace("\n", "
") + string = string.replace(" ", " ") + global laskentaloki + laskentaloki += string + "
" + + +def __noLogFunction(function, params, result): + return None + + +def __logFunction(function, params, result): + global laskentaloki + if params: + + laskentaloki += "
" + laskentaloki += unicode(function.__name__) + "(" + try: + for p in params: + laskentaloki += unicode(p) + ", " + except: + pass + laskentaloki = laskentaloki[:-2] + laskentaloki += ")=
" + unicode(result) + laskentaloki += "" + laskentaloki += "
" + + +def enableLogging(): + global logString + global logFunction + logString = __logString + logFunction = __logFunction + + +def disableLogging(): + global logString + global logFunction + logString = __noLogString + logFunction = __noLogFunction + + +def muteLogging(): + global stack + global logString + global logFunction + stack.append(logString) + stack.append(logFunction) + disableLogging() + + +def unmuteLogging(): + global stack + global logString + global logFunction + logFunction = stack.pop() + logString = stack.pop() + + +def clearLoki(): + global laskentaloki + laskentaloki = "" + + +def palautaLoki(): + global laskentaloki + return laskentaloki + + +try: + logString +except: + logString = None + +try: + logFunction +except: + logFunction = None + +if not logString or not logFunction: + enableLogging() From 1fa0df084bbf5b62416a861844fdff5e5014c924 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 24 Oct 2024 09:59:58 +0300 Subject: [PATCH 04/51] Use absolute import from __future__ Also remove imports with * --- web/tupa/TehtavanMaaritys.py | 11 ++++--- web/tupa/TulosLaskin.py | 17 ++++------ web/tupa/admin.py | 16 ++++++++-- web/tupa/duplicate.py | 3 +- web/tupa/formit.py | 15 +++++++-- web/tupa/funktiot.py | 8 ++--- web/tupa/laskentatyypit.py | 5 +-- web/tupa/log.py | 2 -- web/tupa/logger.py | 12 +++---- web/tupa/models.py | 9 +++--- web/tupa/taulukkolaskin.py | 12 +++---- web/tupa/templatetags/kipatags.py | 1 + web/tupa/tests.py | 31 +++++++++++++++--- web/tupa/urls.py | 2 +- web/tupa/views.py | 53 ++++++++++++++++++++++--------- web/urls.py | 1 + 16 files changed, 129 insertions(+), 69 deletions(-) diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index c16dc353..04b96e2e 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -2,17 +2,18 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -from django.utils.safestring import SafeUnicode +from __future__ import absolute_import from django.template.loader import render_to_string import re import string import operator -from decimal import * -from taulukkolaskin import laskeTaulukko -from TulosLaskin import luoOsatehtavanKaava +from decimal import Decimal + +from .taulukkolaskin import laskeTaulukko +from .TulosLaskin import luoOsatehtavanKaava # Lataamista varten: -from models import * +from .models import OsaTehtava, Parametri, SyoteMaarite, Tehtava from django.core import serializers # Tehtävätyyppien kaavapohja: diff --git a/web/tupa/TulosLaskin.py b/web/tupa/TulosLaskin.py index a2ef5f68..9bf468f8 100644 --- a/web/tupa/TulosLaskin.py +++ b/web/tupa/TulosLaskin.py @@ -2,20 +2,15 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -if not __name__ == "__main__": - from funktiot import * - -from decimal import * -from laskentatyypit import * +from __future__ import absolute_import import re -from taulukkolaskin import * -import math + +from decimal import Decimal, InvalidOperation +from .taulukkolaskin import laskeTaulukko +from .laskentatyypit import MathDict, DictDecimal import operator -# from django.core.exceptions import ObjectDoesNotExist -from django.core.cache import cache -from models import * -import log +from . import log def korvaa(lause, pino, loppu=None): diff --git a/web/tupa/admin.py b/web/tupa/admin.py index 75c1581d..218ab179 100644 --- a/web/tupa/admin.py +++ b/web/tupa/admin.py @@ -3,9 +3,21 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -from models import * +from __future__ import absolute_import from django.contrib import admin -from formit import * +from .formit import KisaForm +from .models import ( + Kisa, + OsaTehtava, + Parametri, + Sarja, + Syote, + SyoteMaarite, + Tehtava, + TestausTulos, + TuomarineuvosTulos, + Vartio, +) class SarjaInline(admin.TabularInline): diff --git a/web/tupa/duplicate.py b/web/tupa/duplicate.py index 5ccce3ef..73b78b78 100644 --- a/web/tupa/duplicate.py +++ b/web/tupa/duplicate.py @@ -2,7 +2,7 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -import models +from django.core import serializers def kisa_xml(kisa): @@ -10,7 +10,6 @@ def kisa_xml(kisa): Apufunktio -> Luo xml merkkijonon kaikista kisan objekteista. Jättää henkilöt ja allergiat luomatta. """ - from django.core import serializers objects = [ kisa, diff --git a/web/tupa/formit.py b/web/tupa/formit.py index 23556469..b679a8c7 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -5,12 +5,23 @@ # -*- coding: utf-8 -*- +from __future__ import absolute_import from django.forms.models import modelformset_factory from django import forms -from models import * +from .models import ( + Kisa, + OsaTehtava, + Sarja, + Syote, + SyoteMaarite, + Tehtava, + TestausTulos, + TuomarineuvosTulos, + Vartio, +) from django.forms import ModelForm from django.forms.models import inlineformset_factory -from decimal import * +from decimal import Decimal import re from django.utils.safestring import SafeUnicode from django.template.loader import render_to_string diff --git a/web/tupa/funktiot.py b/web/tupa/funktiot.py index 06c7ccb6..02cc1006 100644 --- a/web/tupa/funktiot.py +++ b/web/tupa/funktiot.py @@ -4,13 +4,11 @@ """ Tässä tiedostossa on määritelty kaikki funktiot joita voi käyttää laskennan kaavoissa. """ -from laskentatyypit import * +from __future__ import absolute_import -from math import * +from decimal import ROUND_FLOOR, ROUND_CEILING, getcontext -# from decimal import * - -import log +from .laskentatyypit import DictDecimal, suorita_lista def pienin(*lista): diff --git a/web/tupa/laskentatyypit.py b/web/tupa/laskentatyypit.py index 4cdef084..9972065b 100644 --- a/web/tupa/laskentatyypit.py +++ b/web/tupa/laskentatyypit.py @@ -2,9 +2,10 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -from decimal import * +from __future__ import absolute_import +from decimal import Decimal, ROUND_HALF_UP -import log +from . import log def decimal_uni(self): diff --git a/web/tupa/log.py b/web/tupa/log.py index 50ffcb7b..9a55eefc 100644 --- a/web/tupa/log.py +++ b/web/tupa/log.py @@ -1,5 +1,3 @@ -import settings - laskentaloki = "" try: stack diff --git a/web/tupa/logger.py b/web/tupa/logger.py index 3a06ec1f..01b8a42d 100644 --- a/web/tupa/logger.py +++ b/web/tupa/logger.py @@ -2,17 +2,17 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi +from __future__ import absolute_import from __future__ import print_function -from django.conf import settings -from xml.dom.minidom import parse, parseString +from xml.dom.minidom import getDOMImplementation import os.path import re -##from tupa.models import Kisa -from django.shortcuts import get_object_or_404 -from duplicate import kisa_xml +from django.conf import settings + +from .duplicate import kisa_xml +from .models import Kisa -from xml.dom.minidom import getDOMImplementation impl = getDOMImplementation() diff --git a/web/tupa/models.py b/web/tupa/models.py index cc1150d6..34b9eccb 100644 --- a/web/tupa/models.py +++ b/web/tupa/models.py @@ -3,17 +3,16 @@ # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi +from __future__ import absolute_import +from django.core.cache import cache from django.db import models -from random import uniform -from TulosLaskin import * +from .TulosLaskin import laskeSarja import settings import thread import time -import log -from binascii import * -import sys +from . import log class Kipa(models.Model): diff --git a/web/tupa/taulukkolaskin.py b/web/tupa/taulukkolaskin.py index 68cc1361..70d069bb 100644 --- a/web/tupa/taulukkolaskin.py +++ b/web/tupa/taulukkolaskin.py @@ -2,14 +2,14 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi +from __future__ import absolute_import import re -from laskentatyypit import * -from funktiot import perusfunktiot -from funktiot import listafunktiot -import settings +from decimal import Decimal, DivisionByZero, ROUND_HALF_UP +from .laskentatyypit import suorita, suorita_lista, MathDict, DictDecimal +from .funktiot import listafunktiot, perusfunktiot -# from tupa.log import * -import log +import settings +from . import log pfunktiot = {} lfunktiot = {} diff --git a/web/tupa/templatetags/kipatags.py b/web/tupa/templatetags/kipatags.py index 8c9f6702..a9928802 100644 --- a/web/tupa/templatetags/kipatags.py +++ b/web/tupa/templatetags/kipatags.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import from django import template register = template.Library() diff --git a/web/tupa/tests.py b/web/tupa/tests.py index b2b5f5fd..895b66df 100644 --- a/web/tupa/tests.py +++ b/web/tupa/tests.py @@ -2,18 +2,39 @@ # KiPa(KisaPalvelu), tuloslaskentaj�rjestelm� partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi +from __future__ import absolute_import from __future__ import print_function +from decimal import Decimal +import sys import unittest -from models import * -from taulukkolaskin import * -import decimal +from .taulukkolaskin import laske from django.test import TestCase from django.test.runner import DiscoverRunner -from views import * +from .models import Kisa, OsaTehtava, Parametri, Sarja, Syote, Tehtava, TestausTulos +from .views import ( + kisa, + kopioiTehtavia, + korvaaKisa, + laskennanTilanne, + maaritaKisa, + maaritaTehtava, + maaritaValitseTehtava, + maaritaVartiot, + poistaKisa, + sarjanTuloksetCSV, + syotaKisa, + syotaTehtava, + tallennaKisa, + tehtavanVaiheet, + testiTulos, + tulosta, + tulostaSarja, + tulostaSarjaHTML, +) import os from django.test.client import Client -from django.http import HttpRequest, QueryDict +from django.http import HttpRequest import re import settings diff --git a/web/tupa/urls.py b/web/tupa/urls.py index 2150b62e..f7de562d 100644 --- a/web/tupa/urls.py +++ b/web/tupa/urls.py @@ -2,8 +2,8 @@ # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi +from __future__ import absolute_import from django.conf.urls import patterns -from models import * from django.conf import settings tal = r"(?P(talletettu)?)/?$" diff --git a/web/tupa/views.py b/web/tupa/views.py index 7080aeaa..0e460849 100644 --- a/web/tupa/views.py +++ b/web/tupa/views.py @@ -4,33 +4,56 @@ # Copyright (C) 2011 Espoon Partiotuki ry. ept@partio.fi # -*- coding: UTF-8 -*- -from django.shortcuts import render_to_response, redirect, get_object_or_404 -from django.http import Http404, HttpResponse, HttpResponseRedirect -import operator -from decimal import * +from __future__ import absolute_import +import re + from django import forms +from django.core import serializers +from django.shortcuts import render_to_response, redirect, get_object_or_404 +from django.http import HttpResponse +from django.utils.safestring import SafeUnicode +from decimal import ROUND_UP, Decimal import django.template from django.template import RequestContext -from django.utils.safestring import SafeUnicode from django.contrib import messages from django.contrib.auth import authenticate, login, logout -from django.contrib.auth.decorators import permission_required -from duplicate import kopioiTehtava -from duplicate import kisa_xml +from .duplicate import kopioiTehtava +from .duplicate import kisa_xml import random -from models import * -import re -from formit import * -from TehtavanMaaritys import * +from .formit import ( + KisaForm, + SarjaFormSet, + SyoteForm, + TarkistusSyoteForm, + TehtavaLinkkilistaFormset, + TestiTulosForm, + TuomarineuvosForm, + UploadFileForm, + UploadFileNameForm, + VartioFormSet, +) +from .models import ( + Kisa, + OsaTehtava, + Parametri, + Sarja, + Syote, + SyoteMaarite, + Tehtava, + TestausTulos, + TuomarineuvosTulos, + Vartio, +) +from .TehtavanMaaritys import luoTehtavaData, tallennaTehtavaData, tehtavanMaaritysForm import time -from UnicodeTools import * +from .UnicodeTools import UnicodeWriter import django.db -from TulosLaskin import * -from log import * +from .TulosLaskin import laskeSarja +from .log import clearLoki, enableLogging, palautaLoki def kipaResponseRedirect(url): diff --git a/web/urls.py b/web/urls.py index cf9d0b92..5c59709e 100644 --- a/web/urls.py +++ b/web/urls.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import from django.conf.urls import include, patterns from django.contrib import admin from django.conf import settings From 0dd47019c4a78318976f1990964f00d247a120c0 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 25 Oct 2024 13:06:24 +0300 Subject: [PATCH 05/51] Use division from __future__ where needed __div__ doesn't exists in python 3. --- web/tupa/funktiot.py | 6 +++--- web/tupa/laskentatyypit.py | 4 ++-- web/tupa/taulukkolaskin.py | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/web/tupa/funktiot.py b/web/tupa/funktiot.py index 02cc1006..600b9b4e 100644 --- a/web/tupa/funktiot.py +++ b/web/tupa/funktiot.py @@ -31,10 +31,10 @@ def mediaani(*lista): """ values = sorted(lista) if len(values) % 2 == 1: - return DictDecimal(values[(len(values) + 1) / 2 - 1]) + return DictDecimal(values[(len(values) + 1) // 2 - 1]) else: - lower = DictDecimal(values[len(values) / 2 - 1]) - upper = DictDecimal(values[len(values) / 2]) + lower = DictDecimal(values[len(values) // 2 - 1]) + upper = DictDecimal(values[len(values) // 2]) return (DictDecimal(lower + upper)) / 2 diff --git a/web/tupa/laskentatyypit.py b/web/tupa/laskentatyypit.py index 9972065b..472c3c2c 100644 --- a/web/tupa/laskentatyypit.py +++ b/web/tupa/laskentatyypit.py @@ -39,10 +39,10 @@ def __mul__(self, other): def __rmul__(self, other): return self.operate_to_all(lambda a, b: a * b, other) - def __div__(self, other): + def __truediv__(self, other): return self.operate_to_all(lambda a, b: a / b, other) - def __rdiv__(self, other): + def __rtruediv__(self, other): return self.operate_to_all(lambda a, b: b / a, other) def __lt__(self, other): diff --git a/web/tupa/taulukkolaskin.py b/web/tupa/taulukkolaskin.py index 70d069bb..c26b964c 100644 --- a/web/tupa/taulukkolaskin.py +++ b/web/tupa/taulukkolaskin.py @@ -3,6 +3,7 @@ # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi from __future__ import absolute_import +from __future__ import division import re from decimal import Decimal, DivisionByZero, ROUND_HALF_UP from .laskentatyypit import suorita, suorita_lista, MathDict, DictDecimal From c62ecbf07337547658dd65ee709179b4f607ef7c Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 25 Oct 2024 14:18:46 +0300 Subject: [PATCH 06/51] Dict views to lists explicitly when needed --- web/tupa/TehtavanMaaritys.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index 04b96e2e..40f46a94 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -780,8 +780,8 @@ def vapaaKaavaForm(posti, data, prefix): validi = True if "valid" in data.keys() and data["valid"] == False: validi = False - formia = syotteen_kuvaus_field(posti, data, prefix, i, "vk").items()[0] - formib = syotteen_tyyppi_field(posti, data, prefix, i, "vk").items()[0] + formia = list(syotteen_kuvaus_field(posti, data, prefix, i, "vk").items())[0] + formib = list(syotteen_tyyppi_field(posti, data, prefix, i, "vk").items())[0] if validi and "valid" in data.keys() and data["valid"] == False: del data["valid"] formit.append( @@ -790,7 +790,7 @@ def vapaaKaavaForm(posti, data, prefix): if posti and prefix in posti.keys() and posti[prefix] == "vk": if "maaritteet" in data.keys(): - maaritteet = data["maaritteet"].copy().items() + maaritteet = list(data["maaritteet"].copy().items()) for i in range(maara): if maaritteet[i][1]["kali_vihje"] == "": if type(maaritteet[i][0]) == str and maaritteet[i][0][:1] == "#": @@ -864,8 +864,8 @@ def puhdasKaavaForm(posti, data, prefix): validi = True if "valid" in data.keys() and data["valid"] == False: validi = False - formia = syotteen_kuvaus_field(posti, data, prefix, i, "pk").items()[0] - formib = syotteen_tyyppi_field(posti, data, prefix, i, "pk").items()[0] + formia = list(syotteen_kuvaus_field(posti, data, prefix, i, "pk").items())[0] + formib = list(syotteen_tyyppi_field(posti, data, prefix, i, "pk").items())[0] if validi and "valid" in data.keys() and data["valid"] == False: del data["valid"] formit.append( @@ -874,7 +874,7 @@ def puhdasKaavaForm(posti, data, prefix): if posti and prefix in posti.keys() and posti[prefix] == "pk": if "maaritteet" in data.keys(): - maaritteet = data["maaritteet"].copy().items() + maaritteet = list(data["maaritteet"].copy().items()) for i in range(maara): if maaritteet[i][1]["kali_vihje"] == "": if type(maaritteet[i][0]) == str and maaritteet[i][0][:1] == "#": @@ -1022,7 +1022,7 @@ def tehtavanMaaritysForm( ot_formit = [] # Osatehtavien maara kentta: - osatehtavia = len(v["osa_tehtavat"].keys()) + osatehtavia = len(list(v["osa_tehtavat"].keys())) errors = "" if posti and prefix + str(k) + "_osatehtavia" in posti.keys(): # Ja validiointi: From 2d8822cd3e8914cd5a80dcb0d46d33ffa42f290d Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 25 Oct 2024 14:46:52 +0300 Subject: [PATCH 07/51] Python version 3 --- Dockerfile | 5 ++--- docker-entrypoint.sh | 1 - docs/manual.md | 2 +- requirements.txt | 2 +- web/settings/docker.py.example | 7 +++++++ web/tupa/TehtavanMaaritys.py | 18 +++++++++++++----- web/tupa/TulosLaskin.py | 9 ++------- web/tupa/UnicodeTools.py | 7 +++---- web/tupa/formit.py | 26 +++++++++++--------------- web/tupa/funktiot.py | 2 +- web/tupa/laskentatyypit.py | 20 ++++++++++---------- web/tupa/log.py | 6 +++--- web/tupa/models.py | 24 ++++++++++++------------ web/tupa/tests.py | 6 ++---- web/tupa/views.py | 30 ++++++++++++++---------------- 15 files changed, 82 insertions(+), 83 deletions(-) diff --git a/Dockerfile b/Dockerfile index 66addab6..41402928 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,11 @@ -FROM python:2 +FROM python:3.3 WORKDIR /app/web -RUN echo "PYTHONPATH=/usr/local/lib/python2.7/site-packages" | tee -a /etc/profile ENTRYPOINT ["/app/docker-entrypoint.sh"] EXPOSE 3000 CMD ["python", "./manage.py", "runserver", "0.0.0.0:3000"] COPY . /app/ COPY web/settings/docker.py.example /app/web/settings/docker.py -RUN pip install -r /app/requirements.txt +RUN pip install --trusted-host pypi.python.org -r /app/requirements.txt diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index eb624a7e..9727dbcd 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,6 +1,5 @@ #!/bin/bash -export PYTHONPATH="/usr/local/lib/python2.7/site-packages" if [ ! -f "/app/db/secret.txt" ]; then tr -dc A-Za-z0-9 < /dev/urandom | head -c 40 > /app/db/secret.txt fi diff --git a/docs/manual.md b/docs/manual.md index f62dfbde..d72a2482 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -137,7 +137,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. ### Muut käyttöjärjestelmät / itse muokattava asennus Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. -Python 2.7 on testattu. +Tällä hetkellä kehitysversiossa on käytössä Python 3.3. Djangon versio 1.6 on testattu kehityspalvelimen kanssa toimivaksi. diff --git a/requirements.txt b/requirements.txt index 58443d43..7be70edb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ django==1.6 south #mysql-python -git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb +# git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb diff --git a/web/settings/docker.py.example b/web/settings/docker.py.example index 326b9a51..1c7806ad 100644 --- a/web/settings/docker.py.example +++ b/web/settings/docker.py.example @@ -1,5 +1,12 @@ with open("/app/db/secret.txt", "r") as f: SECRET_KEY = f.readline() +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": "/app/db/kipa.db", + } +} + # Should we serve the media files through Python? SERVE_MEDIA = True diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index 40f46a94..aa9e98ce 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -136,7 +136,7 @@ def numero_ajaksi(n): # Pohjapalikoita: # ################### def syotteen_tyyppi_field(posti, data, prefix, syote_id, tyyppi): - nimi = string.letters[syote_id] + nimi = string.ascii_letters[syote_id] id = prefix + "_" + tyyppi + "_" + nimi + "_tyyppi" field_name = "tyyppi_" + nimi value = "piste" @@ -230,7 +230,7 @@ def loadField( def syotteen_kuvaus_field(posti, data, prefix, syote_id, tyyppi): formi = None errors = "" - nimi = string.letters[syote_id] + nimi = string.ascii_letters[syote_id] id = prefix + "_" + tyyppi + "_" + nimi value = "" field_name = "kali_vihje_" + nimi @@ -785,7 +785,11 @@ def vapaaKaavaForm(posti, data, prefix): if validi and "valid" in data.keys() and data["valid"] == False: del data["valid"] formit.append( - {"kali_vihje": formia[1], "nimi": string.letters[i], "tyyppi": formib[1]} + { + "kali_vihje": formia[1], + "nimi": string.ascii_letters[i], + "tyyppi": formib[1], + } ) if posti and prefix in posti.keys() and posti[prefix] == "vk": @@ -869,7 +873,11 @@ def puhdasKaavaForm(posti, data, prefix): if validi and "valid" in data.keys() and data["valid"] == False: del data["valid"] formit.append( - {"kali_vihje": formia[1], "nimi": string.letters[i], "tyyppi": formib[1]} + { + "kali_vihje": formia[1], + "nimi": string.ascii_letters[i], + "tyyppi": formib[1], + } ) if posti and prefix in posti.keys() and posti[prefix] == "pk": @@ -1080,7 +1088,7 @@ def tehtavanMaaritysForm( tId = None v["osa_tehtavat"][uusi_id] = { - "nimi": string.letters[osatehtava_id], + "nimi": string.ascii_letters[osatehtava_id], "tyyppi": "", "kaava": "", "tehtava": tId, diff --git a/web/tupa/TulosLaskin.py b/web/tupa/TulosLaskin.py index 9bf468f8..aa995527 100644 --- a/web/tupa/TulosLaskin.py +++ b/web/tupa/TulosLaskin.py @@ -343,12 +343,7 @@ def laskeSarja(sarja, syotteet, vartiot=None, tehtavat=None): # Tarkistetaan, että pisteet on laskettu (numeerinen arvo). # Vartion pisteet voivat olla myös esim. H, E tai K (katso # silmukka vähän ylempää), tällöin tarkistus on turha. - if ( - pisteet - and type(pisteet) != str - and type(pisteet) != unicode - and tehtavat[t].maksimipisteet != "" - ): + if pisteet and type(pisteet) != str and tehtavat[t].maksimipisteet != "": # Onko pisteet > max pisteet if pisteet > float(tehtavat[t].maksimipisteet): # Lisää huomautus tulosluetteloon @@ -357,7 +352,7 @@ def laskeSarja(sarja, syotteet, vartiot=None, tehtavat=None): # Kokonaispisteet: summa = 0 for s in tulokset[i]: - if s and type(s) != str and type(s) != unicode: + if s and type(s) != str: summa += s tulokset[i].insert(0, summa) # Vartio objekti jokaisen rivin alkuun: diff --git a/web/tupa/UnicodeTools.py b/web/tupa/UnicodeTools.py index d2434a3a..b63585ca 100644 --- a/web/tupa/UnicodeTools.py +++ b/web/tupa/UnicodeTools.py @@ -1,4 +1,4 @@ -import csv, codecs, cStringIO +import csv, codecs, io class UnicodeWriter: @@ -9,16 +9,15 @@ class UnicodeWriter: def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): # Redirect output to a queue - self.queue = cStringIO.StringIO() + self.queue = io.StringIO() self.writer = csv.writer(self.queue, dialect=dialect, **kwds) self.stream = f self.encoder = codecs.getincrementalencoder(encoding)() def writerow(self, row): - self.writer.writerow([s.encode("utf-8") for s in row]) + self.writer.writerow(row) # Fetch UTF-8 output from the queue ... data = self.queue.getvalue() - data = data.decode("utf-8") # ... and reencode it into the target encoding data = self.encoder.encode(data) # write to the target stream diff --git a/web/tupa/formit.py b/web/tupa/formit.py index b679a8c7..abb13b62 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -23,7 +23,7 @@ from django.forms.models import inlineformset_factory from decimal import Decimal import re -from django.utils.safestring import SafeUnicode +from django.utils.safestring import mark_safe from django.template.loader import render_to_string @@ -78,7 +78,7 @@ class SarjaForm(ModelForm): SarjaFormSet = inlineformset_factory(Kisa, Sarja, extra=8, form=SarjaForm) -SarjaFormSet.helppiteksti = SafeUnicode( +SarjaFormSet.helppiteksti = mark_safe( '' ) @@ -110,18 +110,14 @@ class Meta: class TehtavaLinkkilistaFormset(tuhoaTehtaviaFormset): - def __unicode__(self): - piirto = unicode(self.management_form) + def __str__(self): + piirto = str(self.management_form) for form in self.forms: linkki = "" nimi = "" if form.instance: - linkki = unicode(form.instance.id) + "/" - nimi = ( - unicode(form.instance.jarjestysnro) - + ". " - + unicode(form.instance.nimi) - ) + linkki = str(form.instance.id) + "/" + nimi = str(form.instance.jarjestysnro) + ". " + str(form.instance.nimi) piirto = ( piirto + "" ) piirto = piirto.replace("

", "").replace("

", "") - return SafeUnicode(piirto) + return mark_safe(piirto) class HelpWidget(forms.TextInput): @@ -147,7 +143,7 @@ def __init__(self, helptext, *argcv): def render(self, name, value=None, attrs=None): return ( - SafeUnicode(super(HelpWidget, self).render(name, value, attrs)) + mark_safe(super(HelpWidget, self).render(name, value, attrs)) + "' @@ -190,7 +186,7 @@ def clean(self, value): haku = re.match(r"^((\d*)[,.]?\d+)$", value) if haku: merkkijono = "0" + haku.group(0) - return unicode(Decimal(merkkijono.replace(",", "."))) + return str(Decimal(merkkijono.replace(",", "."))) if value == "kesk": return value elif value == "h": @@ -218,7 +214,7 @@ def clean(self, value): super(AikaField, self).clean(value) haku = re.match(r"^(\d+):(\d+):(\d+)$", value) if haku: - return unicode( + return str( int(haku.group(1)) * 60 * 60 + int(haku.group(2)) * 60 + int(haku.group(3)) @@ -366,7 +362,7 @@ def save(self): self.taulu = tulos return tulos - def __unicode__(self): + def __str__(self): formidata = { "name": self.id, "id": self.id, diff --git a/web/tupa/funktiot.py b/web/tupa/funktiot.py index 600b9b4e..ee91ace1 100644 --- a/web/tupa/funktiot.py +++ b/web/tupa/funktiot.py @@ -58,7 +58,7 @@ def summa(*lista): """ s = DictDecimal(0) for v in lista: - if v and not type(v) == unicode and not type(v) == str: + if v and not type(v) == str: s = s + v return s diff --git a/web/tupa/laskentatyypit.py b/web/tupa/laskentatyypit.py index 472c3c2c..bc32e1bd 100644 --- a/web/tupa/laskentatyypit.py +++ b/web/tupa/laskentatyypit.py @@ -13,11 +13,11 @@ def decimal_uni(self): def decimal_repr(self): - return unicode(self.quantize(Decimal("0.1"), rounding=ROUND_HALF_UP)) + return str(self.quantize(Decimal("0.1"), rounding=ROUND_HALF_UP)) -Decimal.__repr__ = decimal_repr -Decimal.__unicode__ = decimal_uni +# Decimal.__repr__ = decimal_repr +# Decimal.__str__ = decimal_uni class SequenceOperations: @@ -110,11 +110,11 @@ def listaksi(self): lista.append(v) return lista - def __unicode__(self): + def __str__(self): stringi = u"{" for k, v in self.items(): if v: - stringi += unicode(k) + ": " + unicode(v) + ", " + stringi += str(k) + ": " + str(v) + ", " stringi = stringi[:-2] stringi += "}" return stringi @@ -155,11 +155,11 @@ def suorita_lista(self, funktio): def listaksi(self): return list(self) - def __unicode__(self): + def __str__(self): stringi = u"[" for l in self: if l: - stringi += unicode(l) + ", " + stringi += str(l) + ", " stringi = stringi[:-2] stringi += "]" return stringi @@ -288,7 +288,7 @@ def karsi(lista, lfunktio): pakotus = 1 # Tähän täytyisi tehdä rekursiivinen sanakirjojen operointi elif hasattr(l, "__contains__"): # on lista - if len(l) > index and not type(l) == str and not type(l) == unicode: + if len(l) > index and not type(l) == str: tavaraa = 1 varvi.append(l[index]) else: @@ -323,7 +323,7 @@ def listaksi(a, *opt): joukkio = [joukkio] if type(joukkio) == Decimal: joukkio = [DictDecimal(joukkio)] - elif type(joukkio) == unicode or type(joukkio) == str: + elif type(joukkio) == str: return joukkio # elif type( joukkio )== MathDict: # return joukkio @@ -404,7 +404,7 @@ def suorita_lista(funktio, a, *param): and len(a) == 0 ): raise KeyError - elif type(a) == unicode: + elif type(a) == str: tulos = None elif type(a) == Decimal or type(a) == bool: tulos = karsi(listaksi(a), funktio) diff --git a/web/tupa/log.py b/web/tupa/log.py index 9a55eefc..1181a9d5 100644 --- a/web/tupa/log.py +++ b/web/tupa/log.py @@ -25,14 +25,14 @@ def __logFunction(function, params, result): if params: laskentaloki += "
" - laskentaloki += unicode(function.__name__) + "(" + laskentaloki += str(function.__name__) + "(" try: for p in params: - laskentaloki += unicode(p) + ", " + laskentaloki += str(p) + ", " except: pass laskentaloki = laskentaloki[:-2] - laskentaloki += ")=
" + unicode(result) + laskentaloki += ")=
" + str(result) laskentaloki += "" laskentaloki += "
" diff --git a/web/tupa/models.py b/web/tupa/models.py index 34b9eccb..8518d5f4 100644 --- a/web/tupa/models.py +++ b/web/tupa/models.py @@ -9,7 +9,7 @@ from .TulosLaskin import laskeSarja import settings -import thread +import threading import time from . import log @@ -28,7 +28,7 @@ class Kisa(models.Model): paikka = models.CharField(max_length=255, blank=True) tunnistus = models.BooleanField(default=False) - def __unicode__(self): + def __str__(self): return self.nimi class Meta: @@ -45,7 +45,7 @@ class Sarja(models.Model): tasapiste_teht2 = models.IntegerField(blank=True, null=True) tasapiste_teht3 = models.IntegerField(blank=True, null=True) - def __unicode__(self): + def __str__(self): return self.kisa.nimi + "." + self.nimi def save(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä @@ -89,7 +89,7 @@ def taustaTulokset(self): laskeeName ) # Tarkistetaan ollaanko tuloksia jo laskemassa. if not laskee: - thread.start_new_thread(self.laskeTulokset, ()) + threading.start_new_thread(self.laskeTulokset, ()) def tuloksetUusiksi(self): # Poistetaan tulosten cache @@ -121,7 +121,7 @@ def delete(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.sarja.tuloksetUusiksi() super(Vartio, self).delete(*args, **kwargs) - def __unicode__(self): + def __str__(self): return self.sarja.kisa.nimi + "." + self.sarja.nimi + "." + str(self.nro) class Meta: @@ -138,7 +138,7 @@ class Henkilo(models.Model): puhelin_nro = models.CharField(max_length=15, blank=True, null=True) homma = models.CharField(max_length=255, blank=True, null=True) - def __unicode__(self): + def __str__(self): return self.nimi class Meta: @@ -198,7 +198,7 @@ def delete(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.sarja.tuloksetUusiksi() super(Tehtava, self).delete(*args, **kwargs) - def __unicode__(self): + def __str__(self): sarja = self.sarja kisa = sarja.kisa return kisa.nimi + "." + sarja.nimi + "." + self.nimi @@ -230,7 +230,7 @@ def delete(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.tehtava.sarja.tuloksetUusiksi() super(OsaTehtava, self).delete(*args, **kwargs) - def __unicode__(self): + def __str__(self): tehtava = self.tehtava sarja = tehtava.sarja kisa = sarja.kisa @@ -261,7 +261,7 @@ def delete(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.osa_tehtava.tehtava.sarja.tuloksetUusiksi() super(SyoteMaarite, self).delete(*args, **kwargs) - def __unicode__(self): + def __str__(self): ot = self.osa_tehtava tehtava = ot.tehtava sarja = tehtava.sarja @@ -298,7 +298,7 @@ def delete(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.vartio.sarja.tuloksetUusiksi() super(Syote, self).delete(*args, **kwargs) - def __unicode__(self): + def __str__(self): vartio = self.vartio maarite = self.maarite ot = maarite.osa_tehtava @@ -337,7 +337,7 @@ def delete(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.vartio.sarja.tuloksetUusiksi() super(TulosTaulu, self).delete(*args, **kwargs) - def __unicode__(self): + def __str__(self): tehtava = self.tehtava sarja = tehtava.sarja kisa = sarja.kisa @@ -377,7 +377,7 @@ class Meta: verbose_name_plural = "OsaTehtavan paramentrit" db_table = u"kipa_parametri" - def __unicode__(self): + def __str__(self): ot = self.osa_tehtava tehtava = ot.tehtava sarja = tehtava.sarja diff --git a/web/tupa/tests.py b/web/tupa/tests.py index 895b66df..de33e0f8 100644 --- a/web/tupa/tests.py +++ b/web/tupa/tests.py @@ -230,7 +230,7 @@ def testTulokset(self): settings.CACHE_TULOKSET = False settings.CACHE_BACKEND = "dummy:///" # No cache in use for s in self.sarjat: - virheilmoitus = unicode("") + virheilmoitus = "" for f in self.fixtures: virheilmoitus = virheilmoitus + f + " " @@ -291,9 +291,7 @@ def testTulokset(self): virhe = str(len(virheet)) + " errors" for v in virheet: virhe = virhe + "\n--------------------------------\n" + v - self.failUnless( - len(virheet) == 0, unicode(virhe).encode("ascii", "replace") - ) + self.assertTrue( len(virheet) == 0, str(virhe) ) sys.stdout.flush() def testTehtavanUudelleenTallennus(self): diff --git a/web/tupa/views.py b/web/tupa/views.py index 0e460849..8e860d36 100644 --- a/web/tupa/views.py +++ b/web/tupa/views.py @@ -11,7 +11,7 @@ from django.core import serializers from django.shortcuts import render_to_response, redirect, get_object_or_404 from django.http import HttpResponse -from django.utils.safestring import SafeUnicode +from django.utils.safestring import mark_safe from decimal import ROUND_UP, Decimal import django.template from django.template import RequestContext @@ -415,7 +415,7 @@ def maaritaTehtava(request, kisa_nimi, tehtava_id=None, sarja_id=None, talletett otsikko = u"Uusi tehtävä" + " (" + sarja.nimi + ")" if tehtava and not tehtava.nimi == "": - otsikko = unicode(tehtava.nimi) + " (" + sarja.nimi + ")" + otsikko = str(tehtava.nimi) + " (" + sarja.nimi + ")" # Talletetaanko ja siirrytäänkö talletettu sivuun? if posti and not "lisaa_maaritteita" in posti.keys() and daatta["valid"]: @@ -830,7 +830,7 @@ def sarjanTuloksetCSV(request, kisa_nimi, sarja_id): otsikkorivi = ["", "Sij.", "Nro:", "Vartio:", "Yht:"] for teht in mukana[0][2:]: - otsikkorivi.append(unicode(teht.jarjestysnro)) + otsikkorivi.append(str(teht.jarjestysnro)) writer.writerow(otsikkorivi) nimirivi = ["", "", "", "", ""] @@ -858,12 +858,12 @@ def sarjanTuloksetCSV(request, kisa_nimi, sarja_id): vartiorivi = [ mukana[i + 1][0].tasa, str(numero), - unicode(mukana[i + 1][0].nro), - unicode(mukana[i + 1][0].nimi), + str(mukana[i + 1][0].nro), + str(mukana[i + 1][0].nimi), ] - vartiorivi.append(unicode(mukana[i + 1][1]).replace(".", ",")) + vartiorivi.append(str(mukana[i + 1][1]).replace(".", ",")) for num in mukana[i + 1][2:]: - vartiorivi.append(unicode(num).replace(".", ",")) + vartiorivi.append(str(num).replace(".", ",")) writer.writerow(vartiorivi) numero = numero + 1 @@ -873,12 +873,12 @@ def sarjanTuloksetCSV(request, kisa_nimi, sarja_id): vartiorivi = [ ulkona[i][0].tasa, str(numero), - unicode(ulkona[i][0].nro), - unicode(ulkona[i][0].nimi), + str(ulkona[i][0].nro), + str(ulkona[i][0].nimi), ] - vartiorivi.append(unicode(ulkona[i][1]).replace(".", ",")) + vartiorivi.append(str(ulkona[i][1]).replace(".", ",")) for num in ulkona[i][2:]: - vartiorivi.append(unicode(num).replace(".", ",")) + vartiorivi.append(str(num).replace(".", ",")) writer.writerow(vartiorivi) ulkona[i].insert(0, numero) @@ -1019,9 +1019,7 @@ def korvaaKisa(request, kisa_nimi=None): except: kisa = None - xml = r"" - for chunk in request.FILES["file"].chunks(): - xml += chunk + xml = request.FILES["file"].read().decode("utf-8") kisat = [] sarjat = [] @@ -1167,11 +1165,11 @@ def raportti_500(request): -Sisältää linkin joka palauttaa tietokannan, sekä viimeisimmän post datan xml formaatissa testausta varten. """ - linkki = SafeUnicode("
" return render_to_response( "500.html", - {"error": SafeUnicode(linkki)}, + {"error": mark_safe(linkki)}, context_instance=RequestContext(request), ) From 8b308cd4061ff688df2ffe0a81170e50eda49d95 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 28 Oct 2024 11:28:53 +0200 Subject: [PATCH 08/51] Remove string literal prefix 'u' --- web/robot/kipa_sivuosoitteet_ja_otsikot.py | 56 +++++++++++----------- web/tupa/TehtavanMaaritys.py | 2 +- web/tupa/TulosLaskin.py | 12 ++--- web/tupa/laskentatyypit.py | 4 +- web/tupa/models.py | 22 ++++----- web/tupa/taulukkolaskin.py | 2 +- web/tupa/views.py | 32 ++++++------- 7 files changed, 64 insertions(+), 66 deletions(-) diff --git a/web/robot/kipa_sivuosoitteet_ja_otsikot.py b/web/robot/kipa_sivuosoitteet_ja_otsikot.py index 01244fae..fec8410a 100644 --- a/web/robot/kipa_sivuosoitteet_ja_otsikot.py +++ b/web/robot/kipa_sivuosoitteet_ja_otsikot.py @@ -2,66 +2,66 @@ # -*- coding: utf-8 -*- # Testikisan nimimääritys, oletusarvona: testikisa -TESTIKISA = u"testikisa" +TESTIKISA = "testikisa" # Kipa pääsivu -KIPA_OTSIKKO = u"Kipa - kaikki kisat" -KIPA_URL = u"http://127.0.0.1:8000/kipa" +KIPA_OTSIKKO = "Kipa - kaikki kisat" +KIPA_URL = "http://127.0.0.1:8000/kipa" # Suoritusten syöttö -TULOSTEN_SYOTTO_OTSIKKO = u"Kipa - Syötä tuloksia" -TULOSTEN_SYOTTO_URL = u"syota" +TULOSTEN_SYOTTO_OTSIKKO = "Kipa - Syötä tuloksia" +TULOSTEN_SYOTTO_URL = "syota" -TULOSTEN_SYOTTO_TARKISTUS_OTSIKKO = u"Kipa - Syötä\ +TULOSTEN_SYOTTO_TARKISTUS_OTSIKKO = "Kipa - Syötä\ tuloksia - tarkistussyötteet" -TULOSTEN_SYOTTO_TARKISTUS_URL = u"syota/tarkistus" +TULOSTEN_SYOTTO_TARKISTUS_URL = "syota/tarkistus" # Tulokset -TULOSTEN_TARKISTUS_OTSIKKO = u"Kipa - Tulokset sarjoittain" -TULOSTEN_TARKISTUS_URL = u"tulosta/normaali" +TULOSTEN_TARKISTUS_OTSIKKO = "Kipa - Tulokset sarjoittain" +TULOSTEN_TARKISTUS_URL = "tulosta/normaali" -TUOMARINEUVOSTO_OTSIKKO = u"Kipa - Tuomarineuvoston antamien\ +TUOMARINEUVOSTO_OTSIKKO = "Kipa - Tuomarineuvoston antamien\ tulosten määritys" -TUOMARINEUVOSTO_URL = u"maarita/tuomarineuvos" +TUOMARINEUVOSTO_URL = "maarita/tuomarineuvos" -LASKENNAN_TILANNE_OTSIKKO = u"Kipa - Tulokset sarjoittain" -LASKENNAN_TILANNE_URL = u"tulosta/tilanne" +LASKENNAN_TILANNE_OTSIKKO = "Kipa - Tulokset sarjoittain" +LASKENNAN_TILANNE_URL = "tulosta/tilanne" # Kisan Määritykset -KISAN_MAARITYS_OTSIKKO = u"Kipa - Määritä kisa" -KISAN_MAARITYS_URL = u"maarita" +KISAN_MAARITYS_OTSIKKO = "Kipa - Määritä kisa" +KISAN_MAARITYS_URL = "maarita" -VARTIOIDEN_MAARITYS_OTSIKKO = u"Kipa - Määritä vartiot" -VARTIOIDEN_MAARITYS_URL = u"maarita/vartiot" +VARTIOIDEN_MAARITYS_OTSIKKO = "Kipa - Määritä vartiot" +VARTIOIDEN_MAARITYS_URL = "maarita/vartiot" -TEHTAVAN_MAARITYS_OTSIKKO = u"Kipa - Muokkaa tehtävää" -TEHTAVAN_MAARITYS_URL = u"maarita/tehtava" +TEHTAVAN_MAARITYS_OTSIKKO = "Kipa - Muokkaa tehtävää" +TEHTAVAN_MAARITYS_URL = "maarita/tehtava" -TESTITULOKSIEN_MAARITYS_OTSIKKO = u"Kipa - Testituloksien määritys" -TESTITULOKSIEN_MAARITYS_URL = u"maarita/testitulos" +TESTITULOKSIEN_MAARITYS_OTSIKKO = "Kipa - Testituloksien määritys" +TESTITULOKSIEN_MAARITYS_URL = "maarita/testitulos" # Ylläpito # huom Listaa kaikki kisat linkki vie pääsivulle -KAIKKI_KISAT_OTSIKKO = u"Kipa - kaikki kisat" +KAIKKI_KISAT_OTSIKKO = "Kipa - kaikki kisat" KAIKKI_KISAT_URL = KIPA_OTSIKKO # Tallenna kisa, ei vielä osaamista filen vastaanottoon, TBD # "http://127.0.0.1:8000/kipa/testi_kisa/tallenna/ # Kisan tuonti tiedostosta, tod.näk helppoa käyttämällä fixtuuria.TBD -KISAN_TUONTI_URL = u"korvaa" -KISAN_TUONTI_OTSIKKO = u"Kipa - Korvaa kisa tiedostosta" +KISAN_TUONTI_URL = "korvaa" +KISAN_TUONTI_OTSIKKO = "Kipa - Korvaa kisa tiedostosta" # Poista Kisa -KISAN_POISTO_OTSIKKO = u"Kipa - Poista kisa" -KISAN_POISTO_URL = u"poista" +KISAN_POISTO_OTSIKKO = "Kipa - Poista kisa" +KISAN_POISTO_URL = "poista" # Autentikointi -admin_tunnus = u"admin" -admin_salasana = u"admin" +admin_tunnus = "admin" +admin_salasana = "admin" diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index aa9e98ce..c03a2b71 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -462,7 +462,7 @@ def maksimisuoritus( prefix, ot_tyyppi, formi, - validiointi=[[is_number], u"Syötä numeroita!"], + validiointi=[[is_number], "Syötä numeroita!"], muunnos=None, ): # Valinnat: diff --git a/web/tupa/TulosLaskin.py b/web/tupa/TulosLaskin.py index aa995527..401190c7 100644 --- a/web/tupa/TulosLaskin.py +++ b/web/tupa/TulosLaskin.py @@ -156,7 +156,7 @@ def luoOsatehtavanKaava(ot_lause, parametrit): log.logString(" kaava = " + ot_lause) korvautuu = True - log.logString(u" Parametrit: ") + log.logString(" Parametrit: ") for p_nimi, p_arvo in parametrit.items(): log.logString(" " + p_nimi + "= " + p_arvo) @@ -196,14 +196,14 @@ def luoTehtavanKaava(t, v): osatehtavat = t.osatehtava_set.all() ot_lauseet = [] - log.logString(u"

Tehtävä: " + t.nimi.upper() + "

") + log.logString("

Tehtävä: " + t.nimi.upper() + "

") if t.kaava.upper() == "SS": - log.logString(u"kaava = ⚡⚡") + log.logString("kaava = ⚡⚡") else: - log.logString(u"kaava = " + t.kaava.upper()) + log.logString("kaava = " + t.kaava.upper()) for ot in osatehtavat: - log.logString(u"\nOsatehtävä: " + ot.nimi.upper() + "") + log.logString("\nOsatehtävä: " + ot.nimi.upper() + "") pino.append(ot.nimi) ot_lause = ot.kaava @@ -330,7 +330,7 @@ def laskeSarja(sarja, syotteet, vartiot=None, tehtavat=None): tuom = vartion_tuomarit.filter(tehtava=tehtavat[t]) if len(tuom): log.logString( - u"Tuomarineuvoston ylimääritys: " + str(tuom[0].pisteet) + "Tuomarineuvoston ylimääritys: " + str(tuom[0].pisteet) ) try: tulokset[i][t] = Decimal(tuom[0].pisteet) diff --git a/web/tupa/laskentatyypit.py b/web/tupa/laskentatyypit.py index bc32e1bd..023724cf 100644 --- a/web/tupa/laskentatyypit.py +++ b/web/tupa/laskentatyypit.py @@ -111,7 +111,7 @@ def listaksi(self): return lista def __str__(self): - stringi = u"{" + stringi = "{" for k, v in self.items(): if v: stringi += str(k) + ": " + str(v) + ", " @@ -156,7 +156,7 @@ def listaksi(self): return list(self) def __str__(self): - stringi = u"[" + stringi = "[" for l in self: if l: stringi += str(l) + ", " diff --git a/web/tupa/models.py b/web/tupa/models.py index 8518d5f4..84441395 100644 --- a/web/tupa/models.py +++ b/web/tupa/models.py @@ -33,7 +33,7 @@ def __str__(self): class Meta: verbose_name_plural = "Kisat" - db_table = u"kipa_kisa" + db_table = "kipa_kisa" class Sarja(models.Model): @@ -98,7 +98,7 @@ def tuloksetUusiksi(self): class Meta: verbose_name_plural = "Sarjat" - db_table = u"kipa_sarja" + db_table = "kipa_sarja" class Vartio(models.Model): @@ -127,7 +127,7 @@ def __str__(self): class Meta: ordering = ("nro",) verbose_name_plural = "Vartiot" - db_table = u"kipa_vartio" + db_table = "kipa_vartio" class Henkilo(models.Model): @@ -143,7 +143,7 @@ def __str__(self): class Meta: verbose_name_plural = "Henkilot" - db_table = u"kipa_henkilo" + db_table = "kipa_henkilo" class Tehtava(models.Model): @@ -206,7 +206,7 @@ def __str__(self): class Meta: ordering = ("jarjestysnro",) verbose_name_plural = "Tehtavat" - db_table = u"kipa_tehtava" + db_table = "kipa_tehtava" class OsaTehtava(models.Model): @@ -239,7 +239,7 @@ def __str__(self): class Meta: verbose_name_plural = "Osatehtavat" ordering = ["nimi"] - db_table = u"kipa_osatehtava" + db_table = "kipa_osatehtava" class SyoteMaarite(models.Model): @@ -281,7 +281,7 @@ def __str__(self): class Meta: ordering = ["osa_tehtava", "nimi"] verbose_name_plural = "Syotteen maaritteet" - db_table = u"kipa_syotemaarite" + db_table = "kipa_syotemaarite" class Syote(models.Model): @@ -321,7 +321,7 @@ def __str__(self): class Meta: verbose_name_plural = "Syotteet" - db_table = u"kipa_syote" + db_table = "kipa_syote" class TulosTaulu(models.Model): @@ -353,7 +353,7 @@ def __str__(self): class Meta: abstract = True - db_table = u"kipa_tulostaulu" + db_table = "kipa_tulostaulu" class TuomarineuvosTulos(TulosTaulu): @@ -365,7 +365,7 @@ class Meta: class TestausTulos(TulosTaulu): class Meta: verbose_name_plural = "Testattavat tulokset" - db_table = u"kipa_testaustulos" + db_table = "kipa_testaustulos" class Parametri(models.Model): @@ -375,7 +375,7 @@ class Parametri(models.Model): class Meta: verbose_name_plural = "OsaTehtavan paramentrit" - db_table = u"kipa_parametri" + db_table = "kipa_parametri" def __str__(self): ot = self.osa_tehtava diff --git a/web/tupa/taulukkolaskin.py b/web/tupa/taulukkolaskin.py index c26b964c..e072ff31 100644 --- a/web/tupa/taulukkolaskin.py +++ b/web/tupa/taulukkolaskin.py @@ -54,7 +54,7 @@ def laske(lauseke, m={}, funktiot={}): f = dictToMathDict(f) log.logString("

Laskenta:

") - log.logString(u"Tehtävän lause = " + lauseke) + log.logString("Tehtävän lause = " + lauseke) # Poistetaan välilyonnit ja enterit: lause = lauseke.replace("\n", "") diff --git a/web/tupa/views.py b/web/tupa/views.py index 8e860d36..eb2ed32f 100644 --- a/web/tupa/views.py +++ b/web/tupa/views.py @@ -301,7 +301,7 @@ def maaritaValitseTehtava(request, kisa_nimi): "tupa/maaritaValitseTehtava.html", { "taulukko": taulukko, - "heading": u"Muokkaa tehtävää", + "heading": "Muokkaa tehtävää", "kisa_nimi": kisa_nimi, }, context_instance=RequestContext(request), @@ -412,7 +412,7 @@ def maaritaTehtava(request, kisa_nimi, tehtava_id=None, sarja_id=None, talletett sarja.taustaTulokset() # Taustalaskenta - otsikko = u"Uusi tehtävä" + " (" + sarja.nimi + ")" + otsikko = "Uusi tehtävä" + " (" + sarja.nimi + ")" if tehtava and not tehtava.nimi == "": otsikko = str(tehtava.nimi) + " (" + sarja.nimi + ")" @@ -450,7 +450,7 @@ def maaritaTehtava(request, kisa_nimi, tehtava_id=None, sarja_id=None, talletett "tehtava_ida": 5, "taakse": { "url": "/kipa/" + kisa_nimi + "/maarita/tehtava/", - "title": u"Muokkaa tehtävää", + "title": "Muokkaa tehtävää", }, "talletettu": tal, "ohjaus_nappi": "lisää uusi tehtävä", @@ -619,7 +619,7 @@ def syotaTehtava(request, kisa_nimi, tehtava_id, talletettu=None, tarkistus=None + "/", "taakse": { "url": "/kipa/" + kisa_nimi + "/syota/", - "title": u"Syötä tuloksia", + "title": "Syötä tuloksia", }, }, context_instance=RequestContext(request), @@ -885,14 +885,12 @@ def sarjanTuloksetCSV(request, kisa_nimi, sarja_id): numero = numero + 1 writer.writerow([""]) - writer.writerow([u"S = syöttämättä"]) - writer.writerow([u"H = vartion suoritus hylätty"]) - writer.writerow([u"K = vartio keskeyttänyt"]) - writer.writerow([u"E = vartio ei ole tehnyt tehtävää"]) + writer.writerow(["S = syöttämättä"]) + writer.writerow(["H = vartion suoritus hylätty"]) + writer.writerow(["K = vartio keskeyttänyt"]) + writer.writerow(["E = vartio ei ole tehnyt tehtävää"]) writer.writerow( - [ - u"! = vartion sijaluku laskettu tasapisteissä määräävien tehtävien perusteella" - ] + ["! = vartion sijaluku laskettu tasapisteissä määräävien tehtävien perusteella"] ) return response @@ -949,7 +947,7 @@ class KopioiForm(forms.Form): return render_to_response( "tupa/valitse_form.html", { - "heading": u"Kopioi Tehtäviä sarjaan: " + sarjaan.nimi, + "heading": "Kopioi Tehtäviä sarjaan: " + sarjaan.nimi, "taulukko": formit, "kisa_nimi": kisa_nimi, "taakse": "/kipa/" + kisa_nimi + "/maarita/tehtava/", @@ -1000,9 +998,9 @@ def korvaaKisa(request, kisa_nimi=None): except: kisa = None - otsikko = u"Korvaa kisa tiedostosta" + otsikko = "Korvaa kisa tiedostosta" if not kisa_nimi: - otsikko = u"Lisää kisa tiedostosta " + otsikko = "Lisää kisa tiedostosta " form = None if request.method == "POST": @@ -1290,7 +1288,7 @@ def tehtavanVaiheet(request, kisa_nimi, tehtava_id, vartio_id=None): '
' - + u"Takaisin määrittelyyn

" + + "Takaisin määrittelyyn

" ) responssi += "" return HttpResponse(responssi) @@ -1302,7 +1300,7 @@ def tehtavanVaiheet(request, kisa_nimi, tehtava_id, vartio_id=None): tehtava = get_object_or_404(Tehtava, id=tehtava_id) responssi = ( - u"Vartion laskennan vaiheet tehtävässä " + tehtava.nimi + "
" + "Vartion laskennan vaiheet tehtävässä " + tehtava.nimi + "
" ) enableLogging() clearLoki() @@ -1317,7 +1315,7 @@ def tehtavanVaiheet(request, kisa_nimi, tehtava_id, vartio_id=None): '' - + u"Takaisin määrittelyyn

" + + "Takaisin määrittelyyn

" ) for v in vartiot: responssi += ( From 2ee0ac8ef9f15b393ae9f9d8a984145fc2ed91bd Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 28 Oct 2024 11:37:04 +0200 Subject: [PATCH 09/51] Use python3 compatible formatting with black 24.10.0 --- .github/workflows/continuous-integration.yml | 7 +-- README.md | 2 +- generate_passwords.py | 62 +++++++++++++------- web/robot/kipa_sivuosoitteet_ja_otsikot.py | 1 + web/tupa/TehtavanMaaritys.py | 1 + web/tupa/logger.py | 1 + web/tupa/tests.py | 2 +- 7 files changed, 48 insertions(+), 28 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 9c2b17b3..e8d52123 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -15,12 +15,11 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install 'black[python2]==21.12b0' - pip install click==8.0.2 # newer version is incompatible + pip install 'black==24.10.0' - name: Check formatting run: | - black -t py27 --check web/ - black -t py27 --check web/**/*.py.example + black -t py33 --check . + black -t py33 --check web/**/*.py.example unit-tests-sqlite: runs-on: ubuntu-latest timeout-minutes: 15 diff --git a/README.md b/README.md index 8b856a75..4ba34dad 100644 --- a/README.md +++ b/README.md @@ -46,4 +46,4 @@ Kipaan suunniteltua kirjautumista. ### Python-koodin formatointi -Koodi noudattaa Black-autoformatterin vesion 21.12.b0 mukaista tyyliä. Formatointi tarkastetaan osana CI-putkea. +Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py33`. Formatointi tarkastetaan osana CI-putkea. diff --git a/generate_passwords.py b/generate_passwords.py index 33ff92b3..229e5bf5 100644 --- a/generate_passwords.py +++ b/generate_passwords.py @@ -2,26 +2,39 @@ import string, random, crypt import MySQLdb + def find_check_ids_by_name(checks, cursor): - # execute SQL query using execute() method. - cursor.execute("SELECT id FROM kipa_tehtava WHERE sarja_id IN (26, 27, 28, 29, 30) AND nimi IN ('%s')" % "', '".join(checks)) - data = cursor.fetchall() + # execute SQL query using execute() method. + cursor.execute( + "SELECT id FROM kipa_tehtava WHERE sarja_id IN (26, 27, 28, 29, 30) AND nimi IN ('%s')" + % "', '".join(checks) + ) + data = cursor.fetchall() + + res = [] + for row in data: + for val in row: + res.append(str(val)) - res = [] - for row in data: - for val in row: - res.append(str(val)) + return res - return res -prefix = 'llhk19-' -baseurl = '/kipa/Leon_lenkki_ja_Hilkan_kilpa_2019/' +prefix = "llhk19-" +baseurl = "/kipa/Leon_lenkki_ja_Hilkan_kilpa_2019/" accounts = { "hamk": ["Tyoesuhdealias", "RistiNollaKorolla"], "liikennepuisto": ["RushHour"], "vanaja": ["HPK"], "actionfactory": ["Action_Factory"], - "yo": ["Larry", "Hexed", "Escape_room", "Commodore_64", "Ruokaralli", "Kanaset", "Kummitusmetsae"], + "yo": [ + "Larry", + "Hexed", + "Escape_room", + "Commodore_64", + "Ruokaralli", + "Kanaset", + "Kummitusmetsae", + ], "tekoaltaat": ["Scrabble"], "kankaantausta": ["Super_Mario_suunnistusmaassa"], "hameensanomat": ["Rubikin_kuutio"], @@ -29,13 +42,13 @@ def find_check_ids_by_name(checks, cursor): "linna": ["Risk", "Arvaa_kuka"], "ahvenisto": ["Afrikan_taehti"], "hakovuori": ["Laulava_muistipeli"], - "verkatehdas": ["Roskaviesti"] + "verkatehdas": ["Roskaviesti"], } -templatefile = '/srv/django/kipa/passwords-llhk19' -path = '/srv/django/kipa/auth_files/llhk19/' +templatefile = "/srv/django/kipa/passwords-llhk19" +path = "/srv/django/kipa/auth_files/llhk19/" letters = string.ascii_letters -access_config = '' +access_config = "" db = MySQLdb.connect(user="kipa", passwd="PWD", host="localhost", db="kipa") cursor = db.cursor() @@ -44,16 +57,18 @@ def find_check_ids_by_name(checks, cursor): for name, checks in accounts.items(): username = prefix + name pwdfile = path + name - password = ''.join(random.choice(letters) for i in range(10)) + password = "".join(random.choice(letters) for i in range(10)) pwhash = crypt.crypt(password) copyfile(templatefile, pwdfile) - f = open(pwdfile, 'a') - print(username + ':' + pwhash, file=f) - print(username + ';' + password) + f = open(pwdfile, "a") + print(username + ":" + pwhash, file=f) + print(username + ";" + password) ids = find_check_ids_by_name(checks, cursor) for id in ids: - access_config = access_config + """ + access_config = ( + access_config + + """ location {baseurl}syota/tehtava/{id} {{ auth_basic "Vain {name}-rastin tulosten syottajille"; auth_basic_user_file "{pwdfile}"; @@ -61,9 +76,12 @@ def find_check_ids_by_name(checks, cursor): uwsgi_pass unix:/run/uwsgi/kipa.sock; }} - """.format(baseurl=baseurl, name=name.capitalize(), id=id, pwdfile=pwdfile) + """.format( + baseurl=baseurl, name=name.capitalize(), id=id, pwdfile=pwdfile + ) + ) -c = open(path + 'access.conf', 'w') +c = open(path + "access.conf", "w") print(access_config, file=c) db.close() diff --git a/web/robot/kipa_sivuosoitteet_ja_otsikot.py b/web/robot/kipa_sivuosoitteet_ja_otsikot.py index fec8410a..75b4a3fa 100644 --- a/web/robot/kipa_sivuosoitteet_ja_otsikot.py +++ b/web/robot/kipa_sivuosoitteet_ja_otsikot.py @@ -1,4 +1,5 @@ """Kisan alasivujen URLit ja sivujen otsikot""" + # -*- coding: utf-8 -*- # Testikisan nimimääritys, oletusarvona: testikisa diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index c03a2b71..e8cecbcc 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -34,6 +34,7 @@ """ This file is made with no explainable logic. It has only been made to work. Most propably the best way to improveis simply rewriting. Anyway the task is not simple. Strongly recommend of using the already defined database syntax. See developement documentation for the actual syntax definition. """ + ######################### # Validiointi funktiot: # ######################### diff --git a/web/tupa/logger.py b/web/tupa/logger.py index 01b8a42d..d019d38d 100644 --- a/web/tupa/logger.py +++ b/web/tupa/logger.py @@ -18,6 +18,7 @@ record_base = '\n\n' + # recorder middleware: class PostDataRecorder: """ diff --git a/web/tupa/tests.py b/web/tupa/tests.py index de33e0f8..7a6753c9 100644 --- a/web/tupa/tests.py +++ b/web/tupa/tests.py @@ -291,7 +291,7 @@ def testTulokset(self): virhe = str(len(virheet)) + " errors" for v in virheet: virhe = virhe + "\n--------------------------------\n" + v - self.assertTrue( len(virheet) == 0, str(virhe) ) + self.assertTrue(len(virheet) == 0, str(virhe)) sys.stdout.flush() def testTehtavanUudelleenTallennus(self): From 0a0a8840d57fabc0e68799497e47f6552ed3ae1e Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 28 Oct 2024 11:49:33 +0200 Subject: [PATCH 10/51] Do not redeclare default file encoding To see more, read PEP 3120. --- web/robot/kipa_sivuosoitteet_ja_otsikot.py | 2 -- web/tupa/TehtavanMaaritys.py | 1 - web/tupa/TulosLaskin.py | 1 - web/tupa/admin.py | 2 -- web/tupa/duplicate.py | 1 - web/tupa/formit.py | 3 --- web/tupa/funktiot.py | 1 - web/tupa/laskentatyypit.py | 1 - web/tupa/logger.py | 1 - web/tupa/models.py | 1 - web/tupa/taulukkolaskin.py | 1 - web/tupa/tests.py | 1 - web/tupa/urls.py | 1 - web/tupa/views.py | 3 --- 14 files changed, 20 deletions(-) diff --git a/web/robot/kipa_sivuosoitteet_ja_otsikot.py b/web/robot/kipa_sivuosoitteet_ja_otsikot.py index 75b4a3fa..85a9ecdc 100644 --- a/web/robot/kipa_sivuosoitteet_ja_otsikot.py +++ b/web/robot/kipa_sivuosoitteet_ja_otsikot.py @@ -1,7 +1,5 @@ """Kisan alasivujen URLit ja sivujen otsikot""" -# -*- coding: utf-8 -*- - # Testikisan nimimääritys, oletusarvona: testikisa TESTIKISA = "testikisa" diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index e8cecbcc..86de3da9 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/TulosLaskin.py b/web/tupa/TulosLaskin.py index 401190c7..aff8a8be 100644 --- a/web/tupa/TulosLaskin.py +++ b/web/tupa/TulosLaskin.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/admin.py b/web/tupa/admin.py index 218ab179..8f9ffc3a 100644 --- a/web/tupa/admin.py +++ b/web/tupa/admin.py @@ -1,5 +1,3 @@ -# encoding: utf-8 - # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/duplicate.py b/web/tupa/duplicate.py index 73b78b78..a48b43b8 100644 --- a/web/tupa/duplicate.py +++ b/web/tupa/duplicate.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/formit.py b/web/tupa/formit.py index abb13b62..c8b7b42e 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -1,10 +1,7 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi -# -*- coding: utf-8 -*- - from __future__ import absolute_import from django.forms.models import modelformset_factory from django import forms diff --git a/web/tupa/funktiot.py b/web/tupa/funktiot.py index ee91ace1..2756937e 100644 --- a/web/tupa/funktiot.py +++ b/web/tupa/funktiot.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi """ diff --git a/web/tupa/laskentatyypit.py b/web/tupa/laskentatyypit.py index 023724cf..5959b325 100644 --- a/web/tupa/laskentatyypit.py +++ b/web/tupa/laskentatyypit.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/logger.py b/web/tupa/logger.py index d019d38d..3695b6bc 100644 --- a/web/tupa/logger.py +++ b/web/tupa/logger.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/models.py b/web/tupa/models.py index 84441395..ebc28dd9 100644 --- a/web/tupa/models.py +++ b/web/tupa/models.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajarjestelma partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/taulukkolaskin.py b/web/tupa/taulukkolaskin.py index e072ff31..cd943794 100644 --- a/web/tupa/taulukkolaskin.py +++ b/web/tupa/taulukkolaskin.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/tests.py b/web/tupa/tests.py index 7a6753c9..5761d0dd 100644 --- a/web/tupa/tests.py +++ b/web/tupa/tests.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentaj�rjestelm� partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/urls.py b/web/tupa/urls.py index f7de562d..39f28fe2 100644 --- a/web/tupa/urls.py +++ b/web/tupa/urls.py @@ -1,4 +1,3 @@ -# encoding: utf-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi diff --git a/web/tupa/views.py b/web/tupa/views.py index eb2ed32f..213ca11c 100644 --- a/web/tupa/views.py +++ b/web/tupa/views.py @@ -1,8 +1,5 @@ -# encoding: utf-8 -# coding: UTF-8 # KiPa(KisaPalvelu), tuloslaskentajärjestelmä partiotaitokilpailuihin # Copyright (C) 2011 Espoon Partiotuki ry. ept@partio.fi -# -*- coding: UTF-8 -*- from __future__ import absolute_import import re From 450318e123b561c72d5c15fe9ffaa5e7fb8c10b3 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 19 Nov 2024 13:09:22 +0200 Subject: [PATCH 11/51] Document development flow with Python 3.3 --- README.md | 22 +++++++++++----------- dev.Dockerfile | 7 +++++++ 2 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 dev.Dockerfile diff --git a/README.md b/README.md index 4ba34dad..dbf8d0ce 100644 --- a/README.md +++ b/README.md @@ -17,20 +17,20 @@ Tämän ohjelman mukana pitäisi tulla kopio GPL-lisenssistä; jos näin ei ole, ### Paikallisen kehitysympäristön pystytys -* Asenna Python2 -* Varmista, että sopiva pip on asennettuna: `python2 -m ensurepip [--user] --upgrade` -* `virtualenv -p /path/to/python2 kipa-venv` -* `source ./kipa-venv/bin/activate` -* `pip install -r requirements.txt` -* `cp ./web/settings/local.py.example ./web/settings/local.py`, muokkaa sopiva polku tietokantatiedostolle -* `cd web` -* `python manage.py runserver` käynnistää kehityspalvelimen +* Luo jonnekkin väliaikainen hakemisto tietokannalle: `mkdir /tmp/tietokanta` +* Kopioi kehitystietokanta: `cp docs/initial.db /tmp/tietokanta/kipa.db` +* `cp ./web/settings/local.py.example ./web/settings/local.py` +* Muokkaa edellisessä luotuun asetustiedostoon tietokantatiedostolle polku `/db/kipa.db` +* Rakenna kontti: `docker build -t kipa_dev -f dev.Dockerfile .` +* Käynnistä kontti: `docker run -it --rm --volume ".:/app" --volume "/tmp/tietokanta:/db" -p 8000:8000 kipa_dev bash` +* Kontissa: `cd web` +* Kontissa: `python manage.py runserver` ### Yksikkötestien ajaminen -* tarvittaessa `source ./kipa-venv/bin/activate` -* `cd web` -* `python manage.py test` +* tarvittaessa edellä kuvattu kontin rakennus ja käynnistäminen +* Kontissa: `cd web` +* Kontissa: `python manage.py test` ### E2E-testien ajaminen diff --git a/dev.Dockerfile b/dev.Dockerfile new file mode 100644 index 00000000..afe411f8 --- /dev/null +++ b/dev.Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.3 + +WORKDIR /app + +COPY ./requirements.txt /requirements.txt + +RUN pip install --trusted-host pypi.python.org -r /requirements.txt From 8c2d7875fccb4b88c53cc907bb17df38aa8c42e7 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 19 Nov 2024 14:23:11 +0200 Subject: [PATCH 12/51] Different types are not orderable in Python 3 --- web/tupa/TehtavanMaaritys.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index 86de3da9..67f4707d 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -1239,7 +1239,7 @@ def tallennaTehtavaData(data): osa_tehtava.id = ot_k osa_tehtava.tehtava = tehtava - if osa_tehtava.id > 0 or osa_tehtava.id == None: + if osa_tehtava.id is None or osa_tehtava.id > 0: osa_tehtava.save() if "parametrit" in ot_v.keys(): for p_k, p_v in ot_v["parametrit"].items(): @@ -1250,7 +1250,7 @@ def tallennaTehtavaData(data): if not type(p_k) == str: parametri.id = p_k parametri.osa_tehtava = osa_tehtava - if parametri.id > 0 or parametri.id == None: + if parametri.id is None or parametri.id > 0: parametri.save() else: @@ -1266,7 +1266,7 @@ def tallennaTehtavaData(data): if not type(m_k) == str: maarite.id = m_k maarite.osa_tehtava = osa_tehtava - if maarite.id > 0 or maarite.id == None: + if maarite.id is None or maarite.id > 0: maarite.save() else: maarite.id = -maarite.id From 033d91c542efcef673c509272b2d2ffdbadc6fac Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 19 Nov 2024 20:43:04 +0200 Subject: [PATCH 13/51] Explicitly mark used fields in FormSet Using shorthand "__all__" is counted as explicit here. Remove unused inlineformset_factory and ModelForm. These fixes are due to deprecation in Django 1.6 and future removal in Django 1.8. --- web/tupa/formit.py | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/web/tupa/formit.py b/web/tupa/formit.py index c8b7b42e..08630e06 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -37,24 +37,26 @@ class VartioForm(ModelForm): class Meta: model = Vartio + fields = [ + "nro", + "nimi", + "lippukunta", + "piiri", + "ulkopuolella", + "keskeyttanyt", + ] VartioFormSet = inlineformset_factory( Sarja, Vartio, extra=30, - fields=( - "nro", - "nimi", - "lippukunta", - "piiri", - "ulkopuolella", - "keskeyttanyt", - ), form=VartioForm, ) -MaariteFormSet = inlineformset_factory(OsaTehtava, SyoteMaarite, extra=3) +MaariteFormSet = inlineformset_factory( + OsaTehtava, SyoteMaarite, extra=3, fields="__all__" +) class SarjaForm(ModelForm): @@ -74,13 +76,22 @@ class SarjaForm(ModelForm): vartion_minimikoko = forms.IntegerField(widget=forms.HiddenInput, required=False) -SarjaFormSet = inlineformset_factory(Kisa, Sarja, extra=8, form=SarjaForm) +SarjaFormSet = inlineformset_factory( + Kisa, + Sarja, + extra=8, + form=SarjaForm, + fields=[ + "nimi", + "tasapiste_teht1", + "tasapiste_teht2", + "tasapiste_teht3", + ], +) SarjaFormSet.helppiteksti = mark_safe( '' ) -TehtavaValintaFormSet = inlineformset_factory(Sarja, Tehtava, fields=("jarjestysnro",)) - class TuhoaTehtavaForm(ModelForm): nimi = forms.CharField(widget=forms.HiddenInput, required=False) @@ -99,6 +110,7 @@ class TuhoaTehtavaForm(ModelForm): class Meta: model = Tehtava + fields = [] tuhoaTehtaviaFormset = modelformset_factory( @@ -398,11 +410,7 @@ def clean_nimi(self): class Meta: model = Kisa - - -class PoistaTehtavaForm(ModelForm): - class Meta: - model = Tehtava + fields = "__all__" class UploadFileForm(forms.Form): From 64f45e8c8af043838ce2ddc7d9b166df84932cc3 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Wed, 20 Nov 2024 13:33:38 +0200 Subject: [PATCH 14/51] Use XHTML style boolean attribute to silence deprecation warning This fix is due to future change in functionality in Django 1.8. --- web/tupa/formit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/tupa/formit.py b/web/tupa/formit.py index 08630e06..e4a02e70 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -250,7 +250,7 @@ def initPisteSyote(self, fieldName): if not kesk == None and not nro == None: if kesk <= nro: # Keskeyttänyt self.fields[fieldName].widget.attrs["class"] = "kesk" - self.fields[fieldName].widget.attrs["readonly"] = True + self.fields[fieldName].widget.attrs["readonly"] = "readonly" self.initial[fieldName] = "kesk" From 18f4ad1e96143c8006b5068981b578a79661bbe0 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Wed, 20 Nov 2024 13:47:01 +0200 Subject: [PATCH 15/51] Upgrade Django to 1.7 Remove souht as Django 1.7 has built-in migrations. --- README.md | 1 + docs/manual.md | 2 +- requirements.txt | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dbf8d0ce..651936a5 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ Tämän ohjelman mukana pitäisi tulla kopio GPL-lisenssistä; jos näin ei ole, * Rakenna kontti: `docker build -t kipa_dev -f dev.Dockerfile .` * Käynnistä kontti: `docker run -it --rm --volume ".:/app" --volume "/tmp/tietokanta:/db" -p 8000:8000 kipa_dev bash` * Kontissa: `cd web` +* Kontissa: `python manage.py migrate` * Kontissa: `python manage.py runserver` ### Yksikkötestien ajaminen diff --git a/docs/manual.md b/docs/manual.md index d72a2482..8b4d7f5e 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.3. -Djangon versio 1.6 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 1.7 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 7be70edb..618fcc86 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -django==1.6 -south +django==1.7 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From cf88f04e07965fec87cd3915aec28a6e560cbaf6 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 22 Nov 2024 14:30:16 +0200 Subject: [PATCH 16/51] Document that manage.py syncdb is no longer in use --- docs/manual.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 8b4d7f5e..01e85d1b 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -922,15 +922,11 @@ Käyttää testidatana kaikkia fixtures/tests/ löytyviä XML-päätteisiä tietokantapohjia. ``` -python manage.py syncdb +python manage.py makemigrations +python manage.py migrate ``` - -päivittää tietokantatiedoston "tupa.db" "models.py" päivitetyn määrittelyn perustella. - -VAROITUS: Mikäli tietokannan rakenne olennaisesti muuttuu, on -mahdollista ettei se enään ole yhteensopiva jo olemassa olevan tietokannan kanssa. -Näin tietokantaa voi olla vaikea enään muokata päivityksen jälkeen. -On suositeltavaa varmuuskopioida ja nollata tietokanta aina ennen päivittämistä. +Ovat komentoja, joilla saadaan päivitettyä tietokannan rakennetta, jos models.py on muuttunut. +Djangon dokumentaatio opastaa niiden käytössä. ``` python manage.py flush From 6de2a26817bbdc35e9f7a1ac2d22b64cbcc89ba5 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 10:22:48 +0200 Subject: [PATCH 17/51] Upgrade Python to version 3.4 --- .github/workflows/continuous-integration.yml | 4 ++-- Dockerfile | 4 ++-- README.md | 2 +- dev.Dockerfile | 4 ++-- docs/manual.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index e8d52123..5a37f937 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -18,8 +18,8 @@ jobs: pip install 'black==24.10.0' - name: Check formatting run: | - black -t py33 --check . - black -t py33 --check web/**/*.py.example + black -t py34 --check . + black -t py34 --check web/**/*.py.example unit-tests-sqlite: runs-on: ubuntu-latest timeout-minutes: 15 diff --git a/Dockerfile b/Dockerfile index 41402928..3d237342 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.3 +FROM python:3.4 WORKDIR /app/web @@ -8,4 +8,4 @@ CMD ["python", "./manage.py", "runserver", "0.0.0.0:3000"] COPY . /app/ COPY web/settings/docker.py.example /app/web/settings/docker.py -RUN pip install --trusted-host pypi.python.org -r /app/requirements.txt +RUN pip install -r /app/requirements.txt diff --git a/README.md b/README.md index 651936a5..e8cd5767 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,4 @@ Kipaan suunniteltua kirjautumista. ### Python-koodin formatointi -Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py33`. Formatointi tarkastetaan osana CI-putkea. +Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py34`. Formatointi tarkastetaan osana CI-putkea. diff --git a/dev.Dockerfile b/dev.Dockerfile index afe411f8..f971a8b4 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,7 +1,7 @@ -FROM python:3.3 +FROM python:3.4 WORKDIR /app COPY ./requirements.txt /requirements.txt -RUN pip install --trusted-host pypi.python.org -r /requirements.txt +RUN pip install -r /requirements.txt diff --git a/docs/manual.md b/docs/manual.md index 01e85d1b..64d19383 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -137,7 +137,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. ### Muut käyttöjärjestelmät / itse muokattava asennus Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. -Tällä hetkellä kehitysversiossa on käytössä Python 3.3. +Tällä hetkellä kehitysversiossa on käytössä Python 3.4. Djangon versio 1.7 on testattu kehityspalvelimen kanssa toimivaksi. From 88d00b843e3222ee925e6a1113134ae8d0c8ab80 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 10:43:46 +0200 Subject: [PATCH 18/51] Upgrade Django to 1.8 --- README.md | 2 +- docs/manual.md | 2 +- requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e8cd5767..db192b4c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Tämän ohjelman mukana pitäisi tulla kopio GPL-lisenssistä; jos näin ei ole, * Rakenna kontti: `docker build -t kipa_dev -f dev.Dockerfile .` * Käynnistä kontti: `docker run -it --rm --volume ".:/app" --volume "/tmp/tietokanta:/db" -p 8000:8000 kipa_dev bash` * Kontissa: `cd web` -* Kontissa: `python manage.py migrate` +* Kontissa: `python manage.py migrate --fake-initial --noinput` * Kontissa: `python manage.py runserver` ### Yksikkötestien ajaminen diff --git a/docs/manual.md b/docs/manual.md index 64d19383..45b41978 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.4. -Djangon versio 1.7 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 1.8 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 618fcc86..22a746e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==1.7 +django==1.8 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From ea18aed0f2611568cf617131838a21fa7088f226 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 12:26:34 +0200 Subject: [PATCH 19/51] Add django.contrib.auth.middleware.SessionAuthenticationMiddleware In Django 1.10, session verification will be enabled regardless of whether or not SessionAuthenticationMiddleware is enabled. This is made to silence deprecation warning. --- web/settings/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 9017a4d5..6e419cd8 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -86,6 +86,7 @@ "django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.auth.middleware.SessionAuthenticationMiddleware", ) ROOT_URLCONF = "urls" From 10999fae4eaf260159257b07f4fe1d6be82aa420 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 12:49:27 +0200 Subject: [PATCH 20/51] Pass callable views to url() and declare urlpatterns as list django.conf.urls.patterns is deprecated and will be removed in Django 2.0. --- web/tupa/urls.py | 103 ++++++++++++++++++++++++----------------------- web/urls.py | 27 +++++++------ 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/web/tupa/urls.py b/web/tupa/urls.py index 39f28fe2..5da3e170 100644 --- a/web/tupa/urls.py +++ b/web/tupa/urls.py @@ -2,82 +2,83 @@ # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi from __future__ import absolute_import -from django.conf.urls import patterns +from django.conf.urls import url from django.conf import settings +from django.views.static import serve + +from .views import * tal = r"(?P(talletettu)?)/?$" -urlpatterns = patterns( - "tupa.views", - (r"^apua/", "apua"), - (r"^$", "etusivu"), - (r"^post_txt/(?P[^/]+)/$", "post_txt"), - (r"^(?P[^/]+)/tallenna/$", "tallennaKisa"), - (r"^login/$", "loginSivu"), - (r"^logout/$", "logoutSivu"), - (r"^lisaaKisa/$", "korvaaKisa"), - (r"^(?P[^/]+)/$", "kisa"), - (r"^uusiKisa/maarita/$", "maaritaKisa"), - (r"^(?P[^/]+)/korvaa/$", "korvaaKisa"), - (r"^(?P[^/]+)/poista/$", "poistaKisa"), - (r"^(?P[^/]+)/maarita/" + tal, "maaritaKisa"), - (r"^(?P[^/]+)/maarita/tehtava/$", "maaritaValitseTehtava"), - ( +urlpatterns = [ + url(r"^apua/", apua), + url(r"^$", etusivu), + url(r"^post_txt/(?P[^/]+)/$", post_txt), + url(r"^(?P[^/]+)/tallenna/$", tallennaKisa), + url(r"^login/$", loginSivu), + url(r"^logout/$", logoutSivu), + url(r"^lisaaKisa/$", korvaaKisa), + url(r"^(?P[^/]+)/$", kisa), + url(r"^uusiKisa/maarita/$", maaritaKisa), + url(r"^(?P[^/]+)/korvaa/$", korvaaKisa), + url(r"^(?P[^/]+)/poista/$", poistaKisa), + url(r"^(?P[^/]+)/maarita/" + tal, maaritaKisa), + url(r"^(?P[^/]+)/maarita/tehtava/$", maaritaValitseTehtava), + url( r"^(?P[^/]+)/maarita/tehtava/uusi/sarja/(?P\d+)/$", - "maaritaTehtava", + maaritaTehtava, ), - ( + url( r"^(?P[^/]+)/maarita/tehtava/(?P\d+)/" + tal, - "maaritaTehtava", + maaritaTehtava, ), - ( + url( r"^(?P[^/]+)/maarita/vaiheet/(?P\d+)/(?P\d*)/?", - "tehtavanVaiheet", + tehtavanVaiheet, ), - (r"^(?P[^/]+)/maarita/vartiot/" + tal, "maaritaVartiot"), - ( + url(r"^(?P[^/]+)/maarita/vartiot/" + tal, maaritaVartiot), + url( r"^(?P[^/]+)/maarita/tehtava/kopioi/sarjaan/(?P\d+)/$", - "kopioiTehtavia", + kopioiTehtavia, ), - (r"^(?P[^/]+)/maarita/testitulos/" + tal, "testiTulos"), - ( + url(r"^(?P[^/]+)/maarita/testitulos/" + tal, testiTulos), + url( r"^(?P[^/]+)/luo/sarja/(?P\d+)/testitulokset/$", - "luoTestiTulokset", + luoTestiTulokset, ), - (r"^(?P[^/]+)/maarita/tuomarineuvos/" + tal, "tuomarineuvos"), - (r"^(?P[^/]+)/syota/(?P(tarkistus/)?)$", "syotaKisa"), - ( + url(r"^(?P[^/]+)/maarita/tuomarineuvos/" + tal, tuomarineuvos), + url(r"^(?P[^/]+)/syota/(?P(tarkistus/)?)$", syotaKisa), + url( r"^(?P[^/]+)/syota/(?P(tarkistus/)?)tehtava/(?P\d+)/" + tal, - "syotaTehtava", + syotaTehtava, ), - (r"^(?P[^/]+)/tulosta/normaali/$", "tulosta"), - ( + url(r"^(?P[^/]+)/tulosta/normaali/$", tulosta), + url( r"^(?P[^/]+)/tulosta/normaali/sarja/(?P\d+)/$", - "tulostaSarja", + tulostaSarja, ), - (r"^(?P[^/]+)/tulosta/tilanne/$", "laskennanTilanne"), - (r"^(?P[^/]+)/tulosta/heijasta/sarja/(?P\d+)/$", "heijasta"), - (r"^(?P[^/]+)/tulosta/heijasta/$", "heijasta"), - ( + url(r"^(?P[^/]+)/tulosta/tilanne/$", laskennanTilanne), + url(r"^(?P[^/]+)/tulosta/heijasta/sarja/(?P\d+)/$", heijasta), + url(r"^(?P[^/]+)/tulosta/heijasta/$", heijasta), + url( r"^(?P[^/]+)/tulosta/tuloste/sarja/(?P\d+)/$", - "tulostaSarjaHTML", + tulostaSarjaHTML, ), - (r"^(?P[^/]+)/tulosta/tuloste/$", "tulosta"), - ( + url(r"^(?P[^/]+)/tulosta/tuloste/$", tulosta), + url( r"^(?P[^/]+)/tulosta/csv/sarja/(?P\d+)/$", - "sarjanTuloksetCSV", + sarjanTuloksetCSV, ), - (r"^(?P[^/]+)/tulosta/csv/$", "tulosta"), - (r"^(?P[^/]+)/tulosta/piirit/$", "piirit"), -) + url(r"^(?P[^/]+)/tulosta/csv/$", tulosta), + url(r"^(?P[^/]+)/tulosta/piirit/$", piirit), +] if settings.DEBUG: - urlpatterns += patterns( - "", - ( + urlpatterns += [ + url( r"^kipamedia/(?P.*)$", - "django.views.static.serve", + serve, {"document_root": settings.STATIC_DOC_ROOT}, ), - ) + ] diff --git a/web/urls.py b/web/urls.py index 5c59709e..803ca2b5 100644 --- a/web/urls.py +++ b/web/urls.py @@ -1,24 +1,25 @@ from __future__ import absolute_import -from django.conf.urls import include, patterns +from django.conf.urls import include, url from django.contrib import admin from django.conf import settings +from django.views.static import serve + +from tupa.views import raportti_500 admin.autodiscover() -urlpatterns = patterns( - "", - (r"^kipa/", include("tupa.urls")), - (r"^admin/", include(admin.site.urls)), -) +urlpatterns = [ + url(r"^kipa/", include("tupa.urls")), + url(r"^admin/", include(admin.site.urls)), +] if settings.SERVE_MEDIA: - urlpatterns += patterns( - "", - ( + urlpatterns += [ + url( r"^kipamedia/(?P.*)$", - "django.views.static.serve", + serve, {"document_root": settings.STATIC_DOC_ROOT}, - ), - ) + ) + ] -handler500 = "tupa.views.raportti_500" +handler500 = raportti_500 From c05fa5667a1b8eba0eac3e7b0b0399ce22c83487 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 12:55:56 +0200 Subject: [PATCH 21/51] Use new TEMPLATES setting to define where templates are This set value tells to load templates from app's subdirectory named "templates" --- web/settings/__init__.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 6e419cd8..4d6e2066 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -91,12 +91,15 @@ ROOT_URLCONF = "urls" -TEMPLATE_DIRS = ( - hakemisto + "/templates", - # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. -) +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [ + hakemisto + "/templates", + ], + "APP_DIRS": True, + }, +] INSTALLED_APPS = [ "django.contrib.auth", From 9586b6d811a010a221076fc3cbdaaf323ac51999 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 14:07:34 +0200 Subject: [PATCH 22/51] Replace render_to_response with render This is due deprecation of context_instance argument for render_to_response. See https://docs.djangoproject.com/en/1.8/releases/1.8/#dictionary-and-context-instance-arguments-of-rendering-functions --- web/tupa/views.py | 119 +++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/web/tupa/views.py b/web/tupa/views.py index 213ca11c..360490d2 100644 --- a/web/tupa/views.py +++ b/web/tupa/views.py @@ -6,7 +6,7 @@ from django import forms from django.core import serializers -from django.shortcuts import render_to_response, redirect, get_object_or_404 +from django.shortcuts import render, redirect, get_object_or_404 from django.http import HttpResponse from django.utils.safestring import mark_safe from decimal import ROUND_UP, Decimal @@ -146,10 +146,10 @@ def etusivu(request): vanha_tietokanta = testaa_tietokanta() if vanha_tietokanta: kisat = None - return render_to_response( + return render( + request, "tupa/index.html", - {"vanha_tietokanta": vanha_tietokanta, "object_list": kisat}, - context_instance=RequestContext(request), + context={"vanha_tietokanta": vanha_tietokanta, "object_list": kisat}, ) @@ -164,15 +164,15 @@ def kisa(request, kisa_nimi): for s in kisa.sarja_set.all(): s.taustaTulokset() # tulosten taustalaskenta - return render_to_response( + return render( + request, "tupa/kisa.html", - { + context={ "kisa": kisa, "kisa_nimi": kisa_nimi, "heading": "Etusivu", "vanha_tietokanta": vanha_tietokanta, }, - context_instance=RequestContext(request), ) @@ -183,15 +183,15 @@ def tulosta(request, kisa_nimi, tulostyyppi=""): if len(tulostyyppi): tulostyyppi += "/" sarjat = Sarja.objects.select_related().filter(kisa__nimi=kisa_nimi) - return render_to_response( + return render( + request, "tupa/tulosta.html", - { + context={ "sarja_list": sarjat, "kisa_nimi": kisa_nimi, "tulostyyppi": tulostyyppi, "heading": "Tulokset sarjoittain", }, - context_instance=RequestContext(request), ) @@ -240,21 +240,22 @@ def maaritaKisa(request, kisa_nimi=None, talletettu=None): taakse = "/kipa/" if kisa_nimi: taakse = "/kipa/" + kisa_nimi + "/" - return render_to_response( + return render( + request, "tupa/maarita.html", - { + context={ "heading": "Määritä kisa", "forms": (kisaForm,), "formsets": (sarjaFormit,), "kisa_nimi": kisa_nimi, "talletettu": tal, }, - context_instance=RequestContext(request), ) else: - return render_to_response( + return render( + request, "tupa/maarita_riisuttu.html", - { + context={ "heading": "Määritä kisa", "forms": (kisaForm,), "formsets": (sarjaFormit,), @@ -262,7 +263,6 @@ def maaritaKisa(request, kisa_nimi=None, talletettu=None): "talletettu": tal, "ohjaus_nappi": "siirry vartioiden määrittelyyn", }, - context_instance=RequestContext(request), ) @@ -294,14 +294,14 @@ def maaritaValitseTehtava(request, kisa_nimi): if posti: return kipaResponseRedirect("/kipa/" + kisa_nimi + "/maarita/tehtava/") else: - return render_to_response( + return render( + request, "tupa/maaritaValitseTehtava.html", - { + context={ "taulukko": taulukko, "heading": "Muokkaa tehtävää", "kisa_nimi": kisa_nimi, }, - context_instance=RequestContext(request), ) @@ -349,16 +349,16 @@ def maaritaVartiot(request, kisa_nimi, talletettu=None): and request.META["HTTP_REFERER"][-23:] == "/kipa/uusiKisa/maarita/" ): ohjaus_nappi = "siirry tehtävien määritykseen" # Ensimmäisellä talletuksella näkyy siirry nappi. - return render_to_response( + return render( + request, "tupa/valitse_formset.html", - { + context={ "taulukko": taulukko, "heading": "Määritä vartiot", "kisa_nimi": kisa_nimi, "talletettu": tal, "ohjaus_nappi": ohjaus_nappi, }, - context_instance=RequestContext(request), ) @@ -438,9 +438,10 @@ def maaritaTehtava(request, kisa_nimi, tehtava_id=None, sarja_id=None, talletett tal = "" if talletettu == "talletettu" and not posti: tal = "Talletettu!" # Edellisellä sivulla talletettu - return render_to_response( + return render( + request, "tupa/maarita.html", - { + context={ "forms": [tehtavaForm], "heading": otsikko, "kisa_nimi": kisa_nimi, @@ -452,7 +453,6 @@ def maaritaTehtava(request, kisa_nimi, tehtava_id=None, sarja_id=None, talletett "talletettu": tal, "ohjaus_nappi": "lisää uusi tehtävä", }, - context_instance=RequestContext(request), ) @@ -474,10 +474,10 @@ def syotaKisa(request, kisa_nimi, tarkistus=None): tehtavat.id = s.id tehtavat.otsikko = s.nimi taulukko.append(tehtavat) - return render_to_response( + return render( + request, "tupa/valitse_linkki.html", - {"taulukko": taulukko, "heading": otsikko, "kisa_nimi": kisa_nimi}, - context_instance=RequestContext(request), + context={"taulukko": taulukko, "heading": otsikko, "kisa_nimi": kisa_nimi}, ) @@ -585,9 +585,10 @@ def syotaTehtava(request, kisa_nimi, tehtava_id, talletettu=None, tarkistus=None tilanne = tehtavanTilanne(tehtava) if syottovirhe: tilanne = "v" - return render_to_response( + return render( + request, "tupa/syota_tehtava.html", - { + context={ "tehtava": tehtava, "sarja": tehtava.sarja.id, "maaritteet": maaritteet, @@ -619,7 +620,6 @@ def syotaTehtava(request, kisa_nimi, tehtava_id, talletettu=None, tarkistus=None "title": "Syötä tuloksia", }, }, - context_instance=RequestContext(request), ) @@ -665,16 +665,16 @@ def testiTulos(request, kisa_nimi, talletettu=None): if talletettu == "talletettu" and not posti: tal = "Talletettu!" - return render_to_response( + return render( + request, "tupa/testitulos.html", - { + context={ "taulukko": taulukko, "heading": "Testituloksien määritys", "kisa_nimi": kisa_nimi, "taakse": "/kipa/" + kisa_nimi + "/", "talletettu": tal, }, - context_instance=RequestContext(request), ) @@ -720,9 +720,10 @@ def tuomarineuvos(request, kisa_nimi, talletettu=None): if talletettu == "talletettu" and not posti: tal = "Talletettu!" - return render_to_response( + return render( + request, "tupa/tuomarineuvos.html", - { + context={ "taulukko": taulukko, "heading": "Tuomarineuvoston antamien tulosten määritys", "kisa_nimi": kisa_nimi, @@ -756,9 +757,10 @@ def tulostaSarja( templaatti = "tupa/tuloksetHTML.html" if vaihtoaika: templaatti = "tupa/heijasta.html" - return render_to_response( + return render( + request, templaatti, - { + context={ "tulos_taulukko": mukana, "ulkona_taulukko": ulkona, "kisa_nimi": kisa_nimi, @@ -769,7 +771,6 @@ def tulostaSarja( "vaihto_id": vaihto_id, "taakse": {"url": "../../", "title": "Tulokset sarjoittain"}, }, - context_instance=RequestContext(request), ) @@ -941,16 +942,16 @@ class KopioiForm(forms.Form): if redirect: return kipaResponseRedirect("/kipa/" + kisa.nimi + "/maarita/tehtava/") else: - return render_to_response( + return render( + request, "tupa/valitse_form.html", - { + context={ "heading": "Kopioi Tehtäviä sarjaan: " + sarjaan.nimi, "taulukko": formit, "kisa_nimi": kisa_nimi, "taakse": "/kipa/" + kisa_nimi + "/maarita/tehtava/", "napin_tyyppi": "kopioi", }, - context_instance=RequestContext(request), ) @@ -974,10 +975,10 @@ def poistaKisa(request, kisa_nimi): kisa.delete() return kipaResponseRedirect("/kipa/") otsikko = "Poista kisa" - return render_to_response( + return render( + request, "tupa/poista_kisa.html", - {"heading": otsikko, "kisa_nimi": kisa_nimi}, - context_instance=RequestContext(request), + context={"heading": otsikko, "kisa_nimi": kisa_nimi}, ) @@ -1107,16 +1108,16 @@ def korvaaKisa(request, kisa_nimi=None): form = UploadFileForm() if kisa_nimi: - return render_to_response( + return render( + request, "tupa/upload.html", - {"heading": otsikko, "form": form, "kisa_nimi": kisa_nimi}, - context_instance=RequestContext(request), + context={"heading": otsikko, "form": form, "kisa_nimi": kisa_nimi}, ) else: - return render_to_response( + return render( + request, "tupa/upload_riisuttu.html", - {"heading": otsikko, "form": form, "kisa_nimi": kisa_nimi}, - context_instance=RequestContext(request), + context={"heading": otsikko, "form": form, "kisa_nimi": kisa_nimi}, ) @@ -1162,11 +1163,7 @@ def raportti_500(request): """ linkki = mark_safe("" - return render_to_response( - "500.html", - {"error": mark_safe(linkki)}, - context_instance=RequestContext(request), - ) + return render(request, "500.html", context={"error": mark_safe(linkki)}) def haeTulos(tuloksetSarjalle, vartio, tehtava): @@ -1261,10 +1258,14 @@ def laskennanTilanne(request, kisa_nimi): taulukko[suurin + 1][sarake] = (None, "0 %") sarake += 1 - return render_to_response( + return render( + request, "tupa/laskennan_tilanne.html", - {"taulukko": taulukko, "kisa_nimi": kisa_nimi, "heading": "Laskennan tilanne"}, - context_instance=RequestContext(request), + context={ + "taulukko": taulukko, + "kisa_nimi": kisa_nimi, + "heading": "Laskennan tilanne", + }, ) From ed35216387858219a57fc1c422f3724cd2113597 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 21:10:11 +0200 Subject: [PATCH 23/51] Upgrade Django to 1.9 Add needed context processors. Remove redeclaration of default template loaders. --- docs/manual.md | 2 +- requirements.txt | 2 +- web/settings/__init__.py | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 45b41978..77be535c 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.4. -Djangon versio 1.8 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 1.9 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 22a746e7..6f148f82 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==1.8 +django==1.9 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 4d6e2066..36bbb9e2 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -75,12 +75,6 @@ # Make this unique, and don't share it with anybody. SECRET_KEY = "shbtq($_^om(xep=5f97k2+ntb3!cqn+)%8r#s6udzqnhj$5p6" -# List of callables that know how to import templates from various sources. -TEMPLATE_LOADERS = ( - "django.template.loaders.filesystem.Loader", - "django.template.loaders.app_directories.Loader", -) - MIDDLEWARE_CLASSES = ( "django.middleware.common.CommonMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", @@ -98,6 +92,13 @@ hakemisto + "/templates", ], "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, }, ] From e92cdce336a172470f8455199933a64e0dd365a4 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 21:26:21 +0200 Subject: [PATCH 24/51] Explicit cascade deletion behavior on_delete will become a required argument in Django 2.0. --- web/tupa/models.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/web/tupa/models.py b/web/tupa/models.py index ebc28dd9..c1f3e629 100644 --- a/web/tupa/models.py +++ b/web/tupa/models.py @@ -5,6 +5,7 @@ from __future__ import absolute_import from django.core.cache import cache from django.db import models +from django.db.models import CASCADE from .TulosLaskin import laskeSarja import settings @@ -39,7 +40,7 @@ class Sarja(models.Model): nimi = models.CharField(max_length=255) vartion_maksimikoko = models.IntegerField(blank=True, null=True, default=0) vartion_minimikoko = models.IntegerField(blank=True, null=True, default=0) - kisa = models.ForeignKey(Kisa) + kisa = models.ForeignKey(Kisa, on_delete=CASCADE) tasapiste_teht1 = models.IntegerField(blank=True, null=True) tasapiste_teht2 = models.IntegerField(blank=True, null=True) tasapiste_teht3 = models.IntegerField(blank=True, null=True) @@ -103,7 +104,7 @@ class Meta: class Vartio(models.Model): nro = models.IntegerField() nimi = models.CharField(max_length=255) - sarja = models.ForeignKey(Sarja) + sarja = models.ForeignKey(Sarja, on_delete=CASCADE) piiri = models.CharField(max_length=255, blank=True) lippukunta = models.CharField(max_length=255, blank=True) puhelinnro = models.CharField(max_length=255, blank=True) @@ -153,7 +154,7 @@ class Tehtava(models.Model): rastikasky = models.TextField(blank=True) jarjestysnro = models.IntegerField() kaava = models.CharField(max_length=255) - sarja = models.ForeignKey(Sarja) + sarja = models.ForeignKey(Sarja, on_delete=CASCADE) tarkistettu = models.BooleanField(default=False) maksimipisteet = models.CharField(max_length=255) svirhe = models.BooleanField(default=False) @@ -219,7 +220,7 @@ class OsaTehtava(models.Model): nimi = models.CharField(max_length=255) tyyppi = models.CharField(max_length=255, choices=OSA_TYYPIT) kaava = models.CharField(max_length=255) - tehtava = models.ForeignKey(Tehtava) + tehtava = models.ForeignKey(Tehtava, on_delete=CASCADE) def save(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.tehtava.sarja.tuloksetUusiksi() @@ -250,7 +251,7 @@ class SyoteMaarite(models.Model): nimi = models.CharField(max_length=255) tyyppi = models.CharField(max_length=255, choices=TYYPPI_VAIHTOEHDOT) kali_vihje = models.CharField(max_length=255, blank=True, null=True) - osa_tehtava = models.ForeignKey(OsaTehtava) + osa_tehtava = models.ForeignKey(OsaTehtava, on_delete=CASCADE) def save(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä self.osa_tehtava.tehtava.sarja.tuloksetUusiksi() @@ -285,8 +286,8 @@ class Meta: class Syote(models.Model): arvo = models.CharField(max_length=255, blank=True, null=True) - vartio = models.ForeignKey(Vartio, blank=True, null=True) - maarite = models.ForeignKey(SyoteMaarite) + vartio = models.ForeignKey(Vartio, blank=True, null=True, on_delete=CASCADE) + maarite = models.ForeignKey(SyoteMaarite, on_delete=CASCADE) tarkistus = models.CharField(max_length=255, blank=True, null=True) def save(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä @@ -324,8 +325,8 @@ class Meta: class TulosTaulu(models.Model): - vartio = models.ForeignKey(Vartio) - tehtava = models.ForeignKey(Tehtava) + vartio = models.ForeignKey(Vartio, on_delete=CASCADE) + tehtava = models.ForeignKey(Tehtava, on_delete=CASCADE) pisteet = models.CharField(max_length=255) def save(self, *args, **kwargs): # Tulokset uusiksi tallennuksen yhteydessä @@ -370,7 +371,7 @@ class Meta: class Parametri(models.Model): nimi = models.CharField(max_length=255) arvo = models.CharField(max_length=255) - osa_tehtava = models.ForeignKey(OsaTehtava) + osa_tehtava = models.ForeignKey(OsaTehtava, on_delete=CASCADE) class Meta: verbose_name_plural = "OsaTehtavan paramentrit" From 25abf6eec3118eed2c9a0aff340a31158dcb3761 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Thu, 21 Nov 2024 21:37:52 +0200 Subject: [PATCH 25/51] include() not needed in admin site url conf Error was: Cannot override the namespace for a dynamic module that provides a namespace. --- web/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/urls.py b/web/urls.py index 803ca2b5..6f038a88 100644 --- a/web/urls.py +++ b/web/urls.py @@ -10,7 +10,7 @@ urlpatterns = [ url(r"^kipa/", include("tupa.urls")), - url(r"^admin/", include(admin.site.urls)), + url(r"^admin/", admin.site.urls), ] if settings.SERVE_MEDIA: From dff518aee552eddf9be9f9c92df4233fb5ae7291 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 22 Nov 2024 09:27:33 +0200 Subject: [PATCH 26/51] Upgrade Django to 1.10 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 77be535c..05e3c57c 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.4. -Djangon versio 1.9 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 1.10 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 6f148f82..ac27922f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==1.9 +django==1.10 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From dffeb8521fe118282ec481f442e55a0d7eae7451 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 22 Nov 2024 14:03:00 +0200 Subject: [PATCH 27/51] Use new MIDDLEWARE setting Old-style middleware using settings.MIDDLEWARE_CLASSES is deprecated. --- web/settings/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 36bbb9e2..590045d1 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -75,13 +75,13 @@ # Make this unique, and don't share it with anybody. SECRET_KEY = "shbtq($_^om(xep=5f97k2+ntb3!cqn+)%8r#s6udzqnhj$5p6" -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = [ "django.middleware.common.CommonMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.auth.middleware.SessionAuthenticationMiddleware", -) +] ROOT_URLCONF = "urls" From 05491c77d42065a585740967a40154d8f1927120 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Fri, 22 Nov 2024 14:36:08 +0200 Subject: [PATCH 28/51] Upgrade Django to 1.11 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 05e3c57c..68cbb404 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.4. -Djangon versio 1.10 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 1.11 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index ac27922f..041d20e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==1.10 +django==1.11 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From ccd72f5e5d00a12682f8cc77ef3138fca9a7aec9 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Sat, 23 Nov 2024 18:38:48 +0200 Subject: [PATCH 29/51] Renderer argument is required on Django 2.1 --- web/tupa/formit.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/tupa/formit.py b/web/tupa/formit.py index e4a02e70..79e2ee34 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -150,9 +150,9 @@ def __init__(self, helptext, *argcv): super(HelpWidget, self).__init__(*argcv) self.helptext = helptext - def render(self, name, value=None, attrs=None): + def render(self, name, value=None, attrs=None, renderer=None): return ( - mark_safe(super(HelpWidget, self).render(name, value, attrs)) + mark_safe(super(HelpWidget, self).render(name, value, attrs, renderer)) + "' @@ -164,7 +164,7 @@ class AikaWidget(forms.TextInput): Text input widget, exept for value formatting field values are converted from total seconds to "hh:mm:ss" """ - def render(self, name, value, attrs=None): + def render(self, name, value, attrs=None, renderer=None): newValue = value if newValue: try: @@ -182,7 +182,7 @@ def render(self, name, value, attrs=None): newValue = str(h) + ":" + str(min) + ":" + str(sec) except ValueError: pass - return super(AikaWidget, self).render(name, newValue, attrs) + return super(AikaWidget, self).render(name, newValue, attrs, renderer) class PisteField(forms.CharField): From 48e525fa2c5cfc00c2de02360349e8e00343b29b Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Sat, 23 Nov 2024 18:48:29 +0200 Subject: [PATCH 30/51] Upgrade Django to 2.0 SessionAuthenticationMiddlewar was removed as planned in commit "Add django.contrib.auth.middleware.SessionAuthenticationMiddleware". --- docs/manual.md | 2 +- requirements.txt | 2 +- web/settings/__init__.py | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 68cbb404..ee5e800b 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.4. -Djangon versio 1.11 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 2.0 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 041d20e1..3e832928 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==1.11 +django==2.0 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 590045d1..34591dc2 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -80,7 +80,6 @@ "django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.auth.middleware.SessionAuthenticationMiddleware", ] ROOT_URLCONF = "urls" From 2f2b0d57f00dcad726154f1a1a1ec13fc083f09e Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Sat, 23 Nov 2024 20:00:08 +0200 Subject: [PATCH 31/51] Remove unnecessary databas dump endpoint --- web/tupa/urls.py | 1 - web/tupa/views.py | 34 ---------------------------------- 2 files changed, 35 deletions(-) diff --git a/web/tupa/urls.py b/web/tupa/urls.py index 5da3e170..b06c23b2 100644 --- a/web/tupa/urls.py +++ b/web/tupa/urls.py @@ -13,7 +13,6 @@ urlpatterns = [ url(r"^apua/", apua), url(r"^$", etusivu), - url(r"^post_txt/(?P[^/]+)/$", post_txt), url(r"^(?P[^/]+)/tallenna/$", tallennaKisa), url(r"^login/$", loginSivu), url(r"^logout/$", logoutSivu), diff --git a/web/tupa/views.py b/web/tupa/views.py index 360490d2..c3cd4401 100644 --- a/web/tupa/views.py +++ b/web/tupa/views.py @@ -2,7 +2,6 @@ # Copyright (C) 2011 Espoon Partiotuki ry. ept@partio.fi from __future__ import absolute_import -import re from django import forms from django.core import serializers @@ -1121,39 +1120,6 @@ def korvaaKisa(request, kisa_nimi=None): ) -def post_txt(request, parametrit): - """ - Apunäkymä virhetilanteisiin. (error 500,server internal error) - -Luo kisan tietokannan xml formaattiin ja lisää perään post_data:n testausta varten. - -Palauttaa xml tiedoston. - """ - from xml.dom.minidom import parseString - - kisa_nimi = re.search(r"^osoite=/kipa/(\w+)/", parametrit).group(1) - kisa = get_object_or_404(Kisa, nimi=kisa_nimi) - test_data = kisa_xml(kisa) - post_data = parametrit.split("&") - doc = parseString(test_data) - post_test = doc.createElement("post_request") - post_test.setAttribute("address", post_data[0].split("=")[1]) - - for p in post_data[1:]: - data = p.split("=") - elem = doc.createElement("input") - elem.setAttribute("name", data[0]) - elem.setAttribute("value", data[1]) - post_test.appendChild(elem) - doc.childNodes[0].appendChild(post_test) - - response = HttpResponse( - doc.toprettyxml(indent=" "), - content_type="application/xml", - context_instance=RequestContext(request), - ) - response["Content-Disposition"] = "attachment; filename=tietokanta.xml" - return response - - def raportti_500(request): """ Html Error 500 sivu (Server internal error), From 579de96a1b366ebe85a8db3824db7931e016a576 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Sat, 23 Nov 2024 20:44:16 +0200 Subject: [PATCH 32/51] Use simplified URL routing syntax --- web/tupa/urls.py | 117 ++++++++++++++++++++++++----------------------- web/urls.py | 11 +++-- 2 files changed, 67 insertions(+), 61 deletions(-) diff --git a/web/tupa/urls.py b/web/tupa/urls.py index b06c23b2..4cd9a099 100644 --- a/web/tupa/urls.py +++ b/web/tupa/urls.py @@ -2,81 +2,86 @@ # Copyright (C) 2010 Espoon Partiotuki ry. ept@partio.fi from __future__ import absolute_import -from django.conf.urls import url +from functools import partial from django.conf import settings +from django.urls import path from django.views.static import serve from .views import * -tal = r"(?P(talletettu)?)/?$" - urlpatterns = [ - url(r"^apua/", apua), - url(r"^$", etusivu), - url(r"^(?P[^/]+)/tallenna/$", tallennaKisa), - url(r"^login/$", loginSivu), - url(r"^logout/$", logoutSivu), - url(r"^lisaaKisa/$", korvaaKisa), - url(r"^(?P[^/]+)/$", kisa), - url(r"^uusiKisa/maarita/$", maaritaKisa), - url(r"^(?P[^/]+)/korvaa/$", korvaaKisa), - url(r"^(?P[^/]+)/poista/$", poistaKisa), - url(r"^(?P[^/]+)/maarita/" + tal, maaritaKisa), - url(r"^(?P[^/]+)/maarita/tehtava/$", maaritaValitseTehtava), - url( - r"^(?P[^/]+)/maarita/tehtava/uusi/sarja/(?P\d+)/$", - maaritaTehtava, + path("apua/", apua), + path("", etusivu), + path("/tallenna/", tallennaKisa), + path("login/", loginSivu), + path("logout/", logoutSivu), + path("lisaaKisa/", korvaaKisa), + path("/", kisa), + path("uusiKisa/maarita/", maaritaKisa), + path("/korvaa/", korvaaKisa), + path("/poista/", poistaKisa), + path("/maarita/", maaritaKisa), + path( + "/maarita/talletettu/", partial(maaritaKisa, talletettu="talletettu") ), - url( - r"^(?P[^/]+)/maarita/tehtava/(?P\d+)/" + tal, - maaritaTehtava, + path("/maarita/tehtava/", maaritaValitseTehtava), + path("/maarita/tehtava/uusi/sarja//", maaritaTehtava), + path("/maarita/tehtava//", maaritaTehtava), + path( + "/maarita/tehtava//talletettu/", + partial(maaritaTehtava, talletettu="talletettu"), ), - url( - r"^(?P[^/]+)/maarita/vaiheet/(?P\d+)/(?P\d*)/?", - tehtavanVaiheet, + path( + "/maarita/vaiheet///", tehtavanVaiheet ), - url(r"^(?P[^/]+)/maarita/vartiot/" + tal, maaritaVartiot), - url( - r"^(?P[^/]+)/maarita/tehtava/kopioi/sarjaan/(?P\d+)/$", - kopioiTehtavia, + path("/maarita/vartiot/", maaritaVartiot), + path( + "/maarita/vartiot/talletettu", + partial(maaritaVartiot, talletettu="talletettu"), ), - url(r"^(?P[^/]+)/maarita/testitulos/" + tal, testiTulos), - url( - r"^(?P[^/]+)/luo/sarja/(?P\d+)/testitulokset/$", - luoTestiTulokset, + path("/maarita/tehtava/kopioi/sarjaan//", kopioiTehtavia), + path("/maarita/testitulos/", testiTulos), + path( + "/maarita/testitulos/talletettu(", + partial(testiTulos, talletettu="talletettu"), ), - url(r"^(?P[^/]+)/maarita/tuomarineuvos/" + tal, tuomarineuvos), - url(r"^(?P[^/]+)/syota/(?P(tarkistus/)?)$", syotaKisa), - url( - r"^(?P[^/]+)/syota/(?P(tarkistus/)?)tehtava/(?P\d+)/" - + tal, - syotaTehtava, + path("/luo/sarja//testitulokset/", luoTestiTulokset), + path("/maarita/tuomarineuvos/", tuomarineuvos), + path( + "/maarita/tuomarineuvos/talletettu", + partial(tuomarineuvos, talletettu="talletettu"), ), - url(r"^(?P[^/]+)/tulosta/normaali/$", tulosta), - url( - r"^(?P[^/]+)/tulosta/normaali/sarja/(?P\d+)/$", - tulostaSarja, + path("/syota/", syotaKisa), + path("/syota/tarkistus/", partial(syotaKisa, tarkistus=True)), + path("/syota/tehtava//", syotaTehtava), + path( + "/syota/tehtava//talletettu/", + partial(syotaTehtava, talletettu="talletettu"), ), - url(r"^(?P[^/]+)/tulosta/tilanne/$", laskennanTilanne), - url(r"^(?P[^/]+)/tulosta/heijasta/sarja/(?P\d+)/$", heijasta), - url(r"^(?P[^/]+)/tulosta/heijasta/$", heijasta), - url( - r"^(?P[^/]+)/tulosta/tuloste/sarja/(?P\d+)/$", - tulostaSarjaHTML, + path( + "/syota/tarkistus/tehtava//", + partial(syotaTehtava, tarkistus=True), ), - url(r"^(?P[^/]+)/tulosta/tuloste/$", tulosta), - url( - r"^(?P[^/]+)/tulosta/csv/sarja/(?P\d+)/$", - sarjanTuloksetCSV, + path( + "/syota/tarkistus/tehtava//talletettu/", + partial(syotaTehtava, tarkistus=True, talletettu="talletettu"), ), - url(r"^(?P[^/]+)/tulosta/csv/$", tulosta), - url(r"^(?P[^/]+)/tulosta/piirit/$", piirit), + path("/tulosta/normaali/", tulosta), + path("/tulosta/normaali/sarja//", tulostaSarja), + path("/tulosta/tilanne/", laskennanTilanne), + path("/tulosta/heijasta/sarja//", heijasta), + path("/tulosta/heijasta/", heijasta), + path("/tulosta/tuloste/sarja//", tulostaSarjaHTML), + path("/tulosta/tuloste/", tulosta), + path("/tulosta/csv/sarja//", sarjanTuloksetCSV), + path("/tulosta/csv/", tulosta), + path("/tulosta/piirit/", piirit), ] if settings.DEBUG: urlpatterns += [ - url( - r"^kipamedia/(?P.*)$", + path( + "kipamedia/", serve, {"document_root": settings.STATIC_DOC_ROOT}, ), diff --git a/web/urls.py b/web/urls.py index 6f038a88..ee648e21 100644 --- a/web/urls.py +++ b/web/urls.py @@ -1,7 +1,8 @@ from __future__ import absolute_import -from django.conf.urls import include, url +from django.conf.urls import include from django.contrib import admin from django.conf import settings +from django.urls import path from django.views.static import serve from tupa.views import raportti_500 @@ -9,14 +10,14 @@ admin.autodiscover() urlpatterns = [ - url(r"^kipa/", include("tupa.urls")), - url(r"^admin/", admin.site.urls), + path("kipa/", include("tupa.urls")), + path("admin/", admin.site.urls), ] if settings.SERVE_MEDIA: urlpatterns += [ - url( - r"^kipamedia/(?P.*)$", + path( + "kipamedia/", serve, {"document_root": settings.STATIC_DOC_ROOT}, ) From da0ae4f56148c89a70881e7df0fdf6f28bbf80c0 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Sat, 23 Nov 2024 21:33:50 +0200 Subject: [PATCH 33/51] Upgrade Python to 3.7 --- .github/workflows/continuous-integration.yml | 4 ++-- Dockerfile | 2 +- README.md | 2 +- dev.Dockerfile | 2 +- docs/manual.md | 2 +- web/tupa/tests.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 5a37f937..6ee81f3c 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -18,8 +18,8 @@ jobs: pip install 'black==24.10.0' - name: Check formatting run: | - black -t py34 --check . - black -t py34 --check web/**/*.py.example + black -t py37 --check . + black -t py37 --check web/**/*.py.example unit-tests-sqlite: runs-on: ubuntu-latest timeout-minutes: 15 diff --git a/Dockerfile b/Dockerfile index 3d237342..b9d633e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.4 +FROM python:3.7 WORKDIR /app/web diff --git a/README.md b/README.md index db192b4c..91a9a56a 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,4 @@ Kipaan suunniteltua kirjautumista. ### Python-koodin formatointi -Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py34`. Formatointi tarkastetaan osana CI-putkea. +Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py37`. Formatointi tarkastetaan osana CI-putkea. diff --git a/dev.Dockerfile b/dev.Dockerfile index f971a8b4..c5d7f9b8 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.4 +FROM python:3.7 WORKDIR /app diff --git a/docs/manual.md b/docs/manual.md index ee5e800b..4382f30d 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -137,7 +137,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. ### Muut käyttöjärjestelmät / itse muokattava asennus Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. -Tällä hetkellä kehitysversiossa on käytössä Python 3.4. +Tällä hetkellä kehitysversiossa on käytössä Python 3.7. Djangon versio 2.0 on testattu kehityspalvelimen kanssa toimivaksi. diff --git a/web/tupa/tests.py b/web/tupa/tests.py index 5761d0dd..ce7ed281 100644 --- a/web/tupa/tests.py +++ b/web/tupa/tests.py @@ -405,7 +405,7 @@ def run_tests( verbosity=1, interactive=True, failfast=True, - **kwargs + **kwargs, ): return run_one_fixture(test_labels, verbosity, interactive, extra_tests) From 05dc3dcbc4966ab07b301a9fa999525200efdbe2 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Sun, 24 Nov 2024 12:16:27 +0200 Subject: [PATCH 34/51] Fix regex warnings * Square brackets in character classes are escaped. * Raw string is used for regexes. * Square brackets not escaped when not a part of character class. * Match parenthesis with character class --- web/tupa/taulukkolaskin.py | 14 +++++++------- web/tupa/tests.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/web/tupa/taulukkolaskin.py b/web/tupa/taulukkolaskin.py index cd943794..d26d17f5 100644 --- a/web/tupa/taulukkolaskin.py +++ b/web/tupa/taulukkolaskin.py @@ -63,10 +63,10 @@ def laske(lauseke, m={}, funktiot={}): lause = re.sub(r"([-][0](?![0-9.]))", r"", lause) # Korvataan funktiot # Vakionumerot numeroinstansseiksi: - oper = r"-+*/(,[<>=" - num = "-?\d+([.]\d+)?" + oper = r"-+*/(,\[<>=" + num = r"-?\d+([.]\d+)?" lause = re.sub( - r"((?')", lause, ) @@ -76,17 +76,17 @@ def laske(lauseke, m={}, funktiot={}): lause = re.sub(r"\.([a-zA-Z_]\w*)(?=\.)", r"['\g<1>']", lause) # .x. -> [x]. lause = re.sub(r"\.([a-zA-Z_]+[a-zA-Z_0-9]*)", r"['\g<1>']", lause) # .x -> [x] lause = re.sub( - r"\.(\d+)(?=[" + oper + "]|$|\]|\))", r"['\g<1>']", lause + r"\.(\d+)(?=[" + oper + "]|$|]|[)])", r"['\g<1>']", lause ) # .n -> [n] lause = re.sub( - r"(?<=[" + oper + r"])([a-zA-Z_0-9]\w*(?=[[]))", r"m['\g<1>']", lause + r"(?<=[" + oper + r"])([a-zA-Z_0-9]\w*(?=[\[]))", r"m['\g<1>']", lause ) # x[ -> m[x][ # Korvataan yksinäiset muuttujat (lähinnä funktioita): lause = re.sub( - r"([a-zA-Z_][a-zA-Z_0-9]*(?![a-zA-Z_0-9.(]|[[']))", r"m['\g<1>']", lause + r"([a-zA-Z_][a-zA-Z_0-9]*(?![a-zA-Z_0-9.(]|[\[']))", r"m['\g<1>']", lause ) # x -> m[x] lause = re.sub( - r"([a-zA-Z_][a-zA-Z_0-9]*(?![a-zA-Z_0-9.]|[[']))", r"f['\g<1>']", lause + r"([a-zA-Z_][a-zA-Z_0-9]*(?![a-zA-Z_0-9.]|[\[']))", r"f['\g<1>']", lause ) # x( -> f[x]( tulos = None # lasketaan tulos: diff --git a/web/tupa/tests.py b/web/tupa/tests.py index ce7ed281..db3a89f1 100644 --- a/web/tupa/tests.py +++ b/web/tupa/tests.py @@ -314,7 +314,7 @@ def testTehtavanUudelleenTallennus(self): ) page = str(c.get(osoite).content) page = page.replace("\n", "") - page = re.sub("\s+", " ", page) + page = re.sub(r"\s+", " ", page) all = re.findall( ')', page ) @@ -335,7 +335,7 @@ def testTehtavanUudelleenTallennus(self): if all: for i in all: j = re.search( - "<(\s*?option.*?selected=[\"']selected[\"'].*?)>", i[1] + r"<(\s*?option.*?selected=[\"']selected[\"'].*?)>", i[1] ) if j: value = re.search("value=[\"'](.*?)[\"']", j.group(1)) From c0ec4ba0045f5aa477101cbace6a3ba6070558e3 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Sun, 24 Nov 2024 15:41:17 +0200 Subject: [PATCH 35/51] Upgrade Django to 2.1 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 4382f30d..a60279e3 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.7. -Djangon versio 2.0 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 2.1 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 3e832928..0408dc7c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==2.0 +django==2.1 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From 1be919533d1a6c59308ff6119215a951fb4443b9 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 16:10:44 +0200 Subject: [PATCH 36/51] Upgrade Django to 2.2 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index a60279e3..05ddbc2e 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.7. -Djangon versio 2.1 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 2.2 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 0408dc7c..063641c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==2.1 +django==2.2 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From 29acda537e0108174ab3f35abc1f33cc8556c3f1 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 17:50:19 +0200 Subject: [PATCH 37/51] Upgrade Django to 3.0 --- docs/manual.md | 2 +- requirements.txt | 2 +- web/settings/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 05ddbc2e..d553ca12 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.7. -Djangon versio 2.2 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 3.0 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 063641c6..7817c8fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==2.2 +django==3.0 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 34591dc2..77402125 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -44,7 +44,7 @@ TIME_ZONE = "Europe/Helsinki" # Language code for this installation. -LANGUAGE_CODE = "fi-FI" +LANGUAGE_CODE = "fi" SITE_ID = 1 From 0a0e7a80bc309bf15994f3d552bdd6d644b2446f Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 17:53:57 +0200 Subject: [PATCH 38/51] Upgrade Django 3.1 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index d553ca12..11153989 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.7. -Djangon versio 3.0 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 3.1 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 7817c8fe..6cb9e823 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==3.0 +django==3.1 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From 188d42f1c1660eac7961e8fc373780964ffeca35 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 18:09:57 +0200 Subject: [PATCH 39/51] Replace depracated ifequal tag with if tag Also ifnotequal tag with if and "!=" --- web/templates/tupa/forms/arviointi.html | 2 +- .../tupa/forms/maksimi_suoritus.html | 6 ++--- web/templates/tupa/forms/nolla_suoritus.html | 20 ++++++++-------- web/templates/tupa/forms/osa_tehtava.html | 6 ++--- web/templates/tupa/forms/puhdas_kaava.html | 4 ++-- web/templates/tupa/forms/vapaa_kaava.html | 4 ++-- web/templates/tupa/heijasta.html | 24 +++++++++---------- web/templates/tupa/laskennan_tilanne.html | 20 ++++++++-------- web/templates/tupa/syota_tehtava.html | 22 ++++++++--------- web/templates/tupa/tulokset.html | 24 +++++++++---------- web/templates/tupa/tuloksetHTML.html | 24 +++++++++---------- web/templates/tupa/valitse.html | 4 ++-- web/templates/tupa/valitse_form.html | 4 ++-- 13 files changed, 82 insertions(+), 82 deletions(-) diff --git a/web/templates/tupa/forms/arviointi.html b/web/templates/tupa/forms/arviointi.html index b09f9754..5157e9a3 100644 --- a/web/templates/tupa/forms/arviointi.html +++ b/web/templates/tupa/forms/arviointi.html @@ -7,7 +7,7 @@

Käytössa:

+{% if arvio.value == "abs" %}checked="checked" {% endif %}/>

@@ -47,22 +47,22 @@ +{% if nollan_kerroin.value == "1.5" %}checked="checked" {% endif %}/> 1.5 (pienin tulos saa parhaat pisteet)
+{% if nollan_kerroin.value == "0.5" %}checked="checked" {% endif%}/> 0.5 (suurin tulos saa parhaat pisteet)
+{% endif %} +{% endif %} +{% endif %}/> muu: diff --git a/web/templates/tupa/forms/osa_tehtava.html b/web/templates/tupa/forms/osa_tehtava.html index 4cdea044..df134dd3 100644 --- a/web/templates/tupa/forms/osa_tehtava.html +++ b/web/templates/tupa/forms/osa_tehtava.html @@ -23,14 +23,14 @@

{{ heading }}

+ {%if sarake.tyyppi == tyyppi %} checked='checked' {% endif %} /> {{sarake.otsikko}}     {% endfor %} {% for sarake in taulukko%} diff --git a/web/templates/tupa/forms/puhdas_kaava.html b/web/templates/tupa/forms/puhdas_kaava.html index d4055ad7..02169951 100644 --- a/web/templates/tupa/forms/puhdas_kaava.html +++ b/web/templates/tupa/forms/puhdas_kaava.html @@ -17,10 +17,10 @@ diff --git a/web/templates/tupa/forms/vapaa_kaava.html b/web/templates/tupa/forms/vapaa_kaava.html index ca8bff8e..8b34703e 100644 --- a/web/templates/tupa/forms/vapaa_kaava.html +++ b/web/templates/tupa/forms/vapaa_kaava.html @@ -13,10 +13,10 @@ diff --git a/web/templates/tupa/heijasta.html b/web/templates/tupa/heijasta.html index 7252d9df..ad143673 100644 --- a/web/templates/tupa/heijasta.html +++ b/web/templates/tupa/heijasta.html @@ -114,13 +114,13 @@ {{ sarake.maksimipisteet }} {% else %} - {% ifnotequal forloop.counter 0 %} - {% ifnotequal forloop.counter 1 %} - {% ifnotequal forloop.counter 2 %} + {% if forloop.counter != 0 %} + {% if forloop.counter != 1 %} + {% if forloop.counter != 2 %} {{ sarake.maksimipisteet }} - {% endifnotequal %} - {% endifnotequal %} - {% endifnotequal %} + {% endif %} + {% endif %} + {% endif %} {% endif %} {%endfor %} @@ -137,7 +137,7 @@ {% else %} {% for sarake in rivi %} {% comment %} ylarivi {% endcomment %} - {% ifequal forloop.counter 2 %} + {% if forloop.counter == 2 %} {% comment %} ekasarake {% endcomment %} {{ sarake.nro }} {{sarake.nimi}} {%if sarake.lippukunta %}
{%endif%} @@ -145,7 +145,7 @@ {%if sarake.piiri %}
{%endif%} {{sarake.piiri}} {% else %} - {% ifequal forloop.counter 3 %} + {% if forloop.counter == 3 %} {{sarake}} {% comment %} muut sarakkeet {% endcomment %} {% else %} @@ -154,8 +154,8 @@ {{ sarake }} {% if forloop.first %} {%endif%} - {% endifequal %} - {% endifequal %} + {% endif %} + {% endif %} {% endfor %} {% endif %} @@ -169,7 +169,7 @@ {% for sarake in rivi %} - {% ifequal forloop.counter 2 %} + {% if forloop.counter == 2 %} {% comment %} ekasarake {% endcomment %} {{ sarake.nro }} {{ sarake.nimi }} {%if sarake.lippukunta %}
{%endif%} @@ -184,7 +184,7 @@ {{ sarake }} {% if forloop.first %} {%endif%} - {% endifequal %} + {% endif %} {% endfor %} {%if forloop.counter|divisibleby:"5" %} diff --git a/web/templates/tupa/laskennan_tilanne.html b/web/templates/tupa/laskennan_tilanne.html index a116dab4..7ef4464b 100644 --- a/web/templates/tupa/laskennan_tilanne.html +++ b/web/templates/tupa/laskennan_tilanne.html @@ -22,23 +22,23 @@

Laskennan tilanne {% now " j.n.Y G:i"%}

{{ sarake.1 }} {%else%} - {% ifequal sarake.0 "a" %} + {% if sarake.0 == "a" %} {{sarake.1|alaviiva_pois}} - {%else%}{% ifequal sarake.0 "o" %} + {%else%}{% if sarake.0 == "o" %} {{sarake.1}} - {%else%}{% ifequal sarake.0 "s" %} + {%else%}{% if sarake.0 == "s" %} {{sarake.1}} - {%else%}{% ifequal sarake.0 "t" %} + {%else%}{% if sarake.0 == "t" %} {{sarake.1|alaviiva_pois}} - {%else%}{% ifequal sarake.0 "v" %} + {%else%}{% if sarake.0 == "v" %} {{sarake.1|alaviiva_pois}} {%else%} {{sarake.1}} - {% endifequal %} - {% endifequal %} - {% endifequal %} - {% endifequal %} - {% endifequal %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} {% endif %} {%endfor%} diff --git a/web/templates/tupa/syota_tehtava.html b/web/templates/tupa/syota_tehtava.html index 49ddafcd..64487eee 100755 --- a/web/templates/tupa/syota_tehtava.html +++ b/web/templates/tupa/syota_tehtava.html @@ -70,21 +70,21 @@

{{tehtava.nimi|alaviiva_pois}}

--> Tehtävän tila: - {%ifequal tilanne.0 "a"%} + {%if tilanne.0 == "a"%} - {% endifequal %} - {%ifequal tilanne.0 "o"%} + {% endif %} + {%if tilanne.0 == "o"%} - {% endifequal %} - {%ifequal tilanne.0 "s"%} + {% endif %} + {%if tilanne.0 == "s"%} - {% endifequal %} - {%ifequal tilanne.0 "t"%} + {% endif %} + {%if tilanne.0 == "t"%} - {% endifequal %} - {%ifequal tilanne.0 "v"%} + {% endif %} + {%if tilanne.0 == "v"%} - {% endifequal %} + {% endif %} @@ -128,7 +128,7 @@

{{tehtava.nimi|alaviiva_pois}}

{% for maarite in osatehtava.syotemaarite_set.all %} {{ maarite.tyyppi }} - {% ifequal maarite.tyyppi "aika" %}(hh:mm:ss){% endifequal %} + {% if maarite.tyyppi == "aika" %}(hh:mm:ss){% endif %} {% endfor %} diff --git a/web/templates/tupa/tulokset.html b/web/templates/tupa/tulokset.html index 1f197096..aa6ebc7d 100644 --- a/web/templates/tupa/tulokset.html +++ b/web/templates/tupa/tulokset.html @@ -86,13 +86,13 @@ {{ sarake.maksimipisteet }} {% else %} - {% ifnotequal forloop.counter 0 %} - {% ifnotequal forloop.counter 1 %} - {% ifnotequal forloop.counter 2 %} + {% if forloop.counter != 0 %} + {% if forloop.counter != 1 %} + {% if forloop.counter != 2 %} {{ sarake.maksimipisteet }} - {% endifnotequal %} - {% endifnotequal %} - {% endifnotequal %} + {% endif %} + {% endif %} + {% endif %} {% endif %} {%endfor %} @@ -109,7 +109,7 @@ {% else %} {% for sarake in rivi %} {% comment %} ylarivi {% endcomment %} - {% ifequal forloop.counter 2 %} + {% if forloop.counter == 2 %} {% comment %} ekasarake {% endcomment %} {{ sarake.nro }} {{sarake.nimi}} {%if sarake.lippukunta %}
{%endif%} @@ -117,7 +117,7 @@ {%if sarake.piiri %}
{%endif%} {{sarake.piiri}} {% else %} - {% ifequal forloop.counter 3 %} + {% if forloop.counter == 3 %} {{sarake}} {% comment %} muut sarakkeet {% endcomment %} {% else %} @@ -126,8 +126,8 @@ {{ sarake }} {% if forloop.first %} {%endif%} - {% endifequal %} - {% endifequal %} + {% endif %} + {% endif %} {% endfor %} {% endif %} @@ -141,7 +141,7 @@ {% for sarake in rivi %} - {% ifequal forloop.counter 2 %} + {% if forloop.counter == 2 %} {% comment %} ekasarake {% endcomment %} {{ sarake.nro }} {{ sarake.nimi }} {%if sarake.lippukunta %}
{%endif%} @@ -156,7 +156,7 @@ {{ sarake }} {% if forloop.first %} {%endif%} - {% endifequal %} + {% endif %} {% endfor %} {%if forloop.counter|divisibleby:"5" %} diff --git a/web/templates/tupa/tuloksetHTML.html b/web/templates/tupa/tuloksetHTML.html index 92b01e56..5237951b 100755 --- a/web/templates/tupa/tuloksetHTML.html +++ b/web/templates/tupa/tuloksetHTML.html @@ -113,13 +113,13 @@ {{ sarake.maksimipisteet }} {% else %} - {% ifnotequal forloop.counter 0 %} - {% ifnotequal forloop.counter 1 %} - {% ifnotequal forloop.counter 2 %} + {% if forloop.counter != 0 %} + {% if forloop.counter != 1 %} + {% if forloop.counter != 2 %} {{ sarake.maksimipisteet }} - {% endifnotequal %} - {% endifnotequal %} - {% endifnotequal %} + {% endif %} + {% endif %} + {% endif %} {% endif %} {%endfor %} @@ -136,7 +136,7 @@ {% else %} {% for sarake in rivi %} {% comment %} ylarivi {% endcomment %} - {% ifequal forloop.counter 2 %} + {% if forloop.counter == 2 %} {% comment %} ekasarake {% endcomment %} {{ sarake.nro }} {{sarake.nimi}} {%if sarake.lippukunta %}
{%endif%} @@ -144,7 +144,7 @@ {%if sarake.piiri %}
{%endif%} {{sarake.piiri}} {% else %} - {% ifequal forloop.counter 3 %} + {% if forloop.counter == 3 %} {{sarake}} {% comment %} muut sarakkeet {% endcomment %} {% else %} @@ -153,8 +153,8 @@ {{ sarake }} {% if forloop.first %} {%endif%} - {% endifequal %} - {% endifequal %} + {% endif %} + {% endif %} {% endfor %} {% endif %} @@ -168,7 +168,7 @@ {% for sarake in rivi %} - {% ifequal forloop.counter 2 %} + {% if forloop.counter == 2 %} {% comment %} ekasarake {% endcomment %} {{ sarake.nro }} {{ sarake.nimi }} {%if sarake.lippukunta %}
{%endif%} @@ -183,7 +183,7 @@ {{ sarake }} {% if forloop.first %} {%endif%} - {% endifequal %} + {% endif %} {% endfor %} {%if forloop.counter|divisibleby:"5" %} diff --git a/web/templates/tupa/valitse.html b/web/templates/tupa/valitse.html index 07999689..d59e3780 100644 --- a/web/templates/tupa/valitse.html +++ b/web/templates/tupa/valitse.html @@ -15,11 +15,11 @@

{{ heading }}

{% if taulukko %} diff --git a/web/templates/tupa/valitse_form.html b/web/templates/tupa/valitse_form.html index ffe3d469..f3828cee 100644 --- a/web/templates/tupa/valitse_form.html +++ b/web/templates/tupa/valitse_form.html @@ -10,10 +10,10 @@ {% block content %}
{{ block.super }} -{%ifequal napin_tyyppi "kopioi" %} +{%if napin_tyyppi == "kopioi" %} {% include "tupa/kopioi.html" %} {% else %} {% include "tupa/tallenna.html" %} -{% endifequal %} +{% endif %}
{% endblock %} From b8c69a146a8980ca63bc54ba124b07e72ce5dd79 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 18:24:53 +0200 Subject: [PATCH 40/51] Upgrade Django to 3.2 Django's default automatic primary key is changed from integer to 64 bit integer. Define that DEFAULT_AUTO_FIELD so that old database doesn't cause warnings on startup. --- docs/manual.md | 2 +- requirements.txt | 2 +- web/settings/__init__.py | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 11153989..1e5dea06 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.7. -Djangon versio 3.1 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 3.2 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 6cb9e823..747e49bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==3.1 +django==3.2 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 77402125..beb46af4 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -118,6 +118,8 @@ TEST_RUNNER = "tupa.tests.CustomTestRunner" +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" + # Should we serve the media files through Python? SERVE_MEDIA = DEBUG From 86a5057b25ed7a53768ea1f876d93cc0bbf8bc41 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 20:17:34 +0200 Subject: [PATCH 41/51] Upgrade Python to 3.10 --- .github/workflows/continuous-integration.yml | 4 ++-- Dockerfile | 2 +- README.md | 2 +- dev.Dockerfile | 2 +- docs/manual.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 6ee81f3c..e21ac4f2 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -18,8 +18,8 @@ jobs: pip install 'black==24.10.0' - name: Check formatting run: | - black -t py37 --check . - black -t py37 --check web/**/*.py.example + black -t py310 --check . + black -t py310 --check web/**/*.py.example unit-tests-sqlite: runs-on: ubuntu-latest timeout-minutes: 15 diff --git a/Dockerfile b/Dockerfile index b9d633e8..09fa06ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.7 +FROM python:3.10 WORKDIR /app/web diff --git a/README.md b/README.md index 91a9a56a..b3b5b767 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,4 @@ Kipaan suunniteltua kirjautumista. ### Python-koodin formatointi -Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py37`. Formatointi tarkastetaan osana CI-putkea. +Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py310`. Formatointi tarkastetaan osana CI-putkea. diff --git a/dev.Dockerfile b/dev.Dockerfile index c5d7f9b8..1828c270 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.7 +FROM python:3.10 WORKDIR /app diff --git a/docs/manual.md b/docs/manual.md index 1e5dea06..b6196e9c 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -137,7 +137,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. ### Muut käyttöjärjestelmät / itse muokattava asennus Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. -Tällä hetkellä kehitysversiossa on käytössä Python 3.7. +Tällä hetkellä kehitysversiossa on käytössä Python 3.10. Djangon versio 3.2 on testattu kehityspalvelimen kanssa toimivaksi. From 0120de9ae577e6dbba74ce1b24cb3f80372ddd02 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 20:52:16 +0200 Subject: [PATCH 42/51] Upgrade Django to 4.0 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index b6196e9c..0027fba1 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.10. -Djangon versio 3.2 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 4.0 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 747e49bd..99d69f0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==3.2 +django==4.0 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From 0f36c23fa127896373be792d3121f6ce50ddfc12 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 20:53:28 +0200 Subject: [PATCH 43/51] Do not use time zone support This is the default, but it is going to change in Django 5.0 to be enabled by default. --- web/settings/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/web/settings/__init__.py b/web/settings/__init__.py index beb46af4..926a8b5e 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -42,6 +42,7 @@ # Local time zone for this installation. TIME_ZONE = "Europe/Helsinki" +USE_TZ = False # Language code for this installation. LANGUAGE_CODE = "fi" From a7bae8071081ea179e985097957e81e86d70b046 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Mon, 25 Nov 2024 21:17:49 +0200 Subject: [PATCH 44/51] Upgrade Django to 4.1 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 0027fba1..24a633dc 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.10. -Djangon versio 4.0 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 4.1 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index 99d69f0a..bd5f239b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==4.0 +django==4.1 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From d670d002d8da8ac73359e506818fa637994b0492 Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 26 Nov 2024 07:23:29 +0200 Subject: [PATCH 45/51] Use new recommended style to render forms Add CSS class to make sure that formsets are not spread to multiple "lines". --- web/media/kipa.css | 3 +++ web/settings/__init__.py | 2 ++ web/templates/tupa/maarita.html | 4 +++- web/templates/tupa/maarita_riisuttu.html | 4 +++- web/templates/tupa/valitse_formset.html | 4 +++- 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/web/media/kipa.css b/web/media/kipa.css index 59e930d5..513e9bd6 100644 --- a/web/media/kipa.css +++ b/web/media/kipa.css @@ -498,3 +498,6 @@ td.th_erotin { .capitalize {text-transform:capitalize;} +.oneRowInlineForm { + display: flex; +} \ No newline at end of file diff --git a/web/settings/__init__.py b/web/settings/__init__.py index 926a8b5e..1c2600c6 100644 --- a/web/settings/__init__.py +++ b/web/settings/__init__.py @@ -121,6 +121,8 @@ DEFAULT_AUTO_FIELD = "django.db.models.AutoField" +FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer" + # Should we serve the media files through Python? SERVE_MEDIA = DEBUG diff --git a/web/templates/tupa/maarita.html b/web/templates/tupa/maarita.html index 08734a21..cb59a5f1 100644 --- a/web/templates/tupa/maarita.html +++ b/web/templates/tupa/maarita.html @@ -24,7 +24,9 @@

{{heading|alaviiva_pois}}

{{formset.label}} {{formset.helppiteksti}} {{ formset.management_form }} {% for form in formset.forms %} - {{ form }}
+
+ {{ form }} +
{% endfor %} {% endfor%} diff --git a/web/templates/tupa/maarita_riisuttu.html b/web/templates/tupa/maarita_riisuttu.html index 22fe9515..c6091dac 100644 --- a/web/templates/tupa/maarita_riisuttu.html +++ b/web/templates/tupa/maarita_riisuttu.html @@ -21,7 +21,9 @@

{{ heading }}

{{formset.label}} {{ formset.management_form }} {% for form in formset.forms %} - {{ form }}
+
+ {{ form }} +
{% endfor %} {% endfor%} diff --git a/web/templates/tupa/valitse_formset.html b/web/templates/tupa/valitse_formset.html index 2deb097e..ed3757cf 100644 --- a/web/templates/tupa/valitse_formset.html +++ b/web/templates/tupa/valitse_formset.html @@ -15,7 +15,9 @@ Keskeyttäneille vartioille ei enää syötetä tuloksia kyseisestä tehtävästä lähtien.
Sarjan ulkopuolelle siirtyneet vartiot saavat tulokset normaalisti, mutta niiden syötteitä ei käytetä esim. määriteltäessä interpoloinnissa nopeinta suoritusta.

{% for form in sarake.forms %} - {{ form }}
+
+ {{ form }} +
{% endfor %} {% endblock%} {% block content %} From 431cbba968b49233ca40818b4aabd53b7bbff2aa Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 26 Nov 2024 07:37:52 +0200 Subject: [PATCH 46/51] Upgrade Django to 4.2 --- docs/manual.md | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 24a633dc..90ef0319 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.10. -Djangon versio 4.1 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 4.2 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index bd5f239b..ff4d5f6b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==4.1 +django==4.2 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb From 1fe44cf07ebd63a89b7ab8498fb63e9940e85ecc Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 26 Nov 2024 09:50:42 +0200 Subject: [PATCH 47/51] Upgrade Python to 3.12 --- .github/workflows/continuous-integration.yml | 4 ++-- Dockerfile | 2 +- README.md | 17 +++++++---------- dev.Dockerfile | 7 ------- docs/manual.md | 2 +- web/tupa/TehtavanMaaritys.py | 4 ++-- web/tupa/TulosLaskin.py | 6 +++--- 7 files changed, 16 insertions(+), 26 deletions(-) delete mode 100644 dev.Dockerfile diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index e21ac4f2..15463cff 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -18,8 +18,8 @@ jobs: pip install 'black==24.10.0' - name: Check formatting run: | - black -t py310 --check . - black -t py310 --check web/**/*.py.example + black -t py312 --check . + black -t py312 --check web/**/*.py.example unit-tests-sqlite: runs-on: ubuntu-latest timeout-minutes: 15 diff --git a/Dockerfile b/Dockerfile index 09fa06ac..46ad8b45 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10 +FROM python:3.12 WORKDIR /app/web diff --git a/README.md b/README.md index b3b5b767..2b5c7403 100644 --- a/README.md +++ b/README.md @@ -20,18 +20,15 @@ Tämän ohjelman mukana pitäisi tulla kopio GPL-lisenssistä; jos näin ei ole, * Luo jonnekkin väliaikainen hakemisto tietokannalle: `mkdir /tmp/tietokanta` * Kopioi kehitystietokanta: `cp docs/initial.db /tmp/tietokanta/kipa.db` * `cp ./web/settings/local.py.example ./web/settings/local.py` -* Muokkaa edellisessä luotuun asetustiedostoon tietokantatiedostolle polku `/db/kipa.db` -* Rakenna kontti: `docker build -t kipa_dev -f dev.Dockerfile .` -* Käynnistä kontti: `docker run -it --rm --volume ".:/app" --volume "/tmp/tietokanta:/db" -p 8000:8000 kipa_dev bash` -* Kontissa: `cd web` -* Kontissa: `python manage.py migrate --fake-initial --noinput` -* Kontissa: `python manage.py runserver` +* Muokkaa edellisessä luotuun asetustiedostoon tietokantatiedostolle polku `/tmp/tietokanta/kipa.db` +* `cd web` +* `python manage.py migrate --fake-initial --noinput` +* `python manage.py runserver` ### Yksikkötestien ajaminen -* tarvittaessa edellä kuvattu kontin rakennus ja käynnistäminen -* Kontissa: `cd web` -* Kontissa: `python manage.py test` +* `cd web` +* `python manage.py test` ### E2E-testien ajaminen @@ -47,4 +44,4 @@ Kipaan suunniteltua kirjautumista. ### Python-koodin formatointi -Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py310`. Formatointi tarkastetaan osana CI-putkea. +Koodi noudattaa Black-autoformatterin vesion 24.10.0 mukaista tyyliä. Blackille annetaan lippu `--target-version py312`. Formatointi tarkastetaan osana CI-putkea. diff --git a/dev.Dockerfile b/dev.Dockerfile deleted file mode 100644 index 1828c270..00000000 --- a/dev.Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM python:3.10 - -WORKDIR /app - -COPY ./requirements.txt /requirements.txt - -RUN pip install -r /requirements.txt diff --git a/docs/manual.md b/docs/manual.md index 90ef0319..2f27a02b 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -137,7 +137,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. ### Muut käyttöjärjestelmät / itse muokattava asennus Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. -Tällä hetkellä kehitysversiossa on käytössä Python 3.10. +Tällä hetkellä kehitysversiossa on käytössä Python 3.12. Djangon versio 4.2 on testattu kehityspalvelimen kanssa toimivaksi. diff --git a/web/tupa/TehtavanMaaritys.py b/web/tupa/TehtavanMaaritys.py index 67f4707d..cc28ffcc 100644 --- a/web/tupa/TehtavanMaaritys.py +++ b/web/tupa/TehtavanMaaritys.py @@ -48,7 +48,7 @@ def is_number(s): def is_string(s): - if re.match("^\w+$", s.replace(" ", "_")): + if re.match(r"^\w+$", s.replace(" ", "_")): return True else: return False @@ -71,7 +71,7 @@ def is_kaava(s): else: muuttujat = {} kaava = s.replace(".", "") - haku = re.finditer("([a-zA-Z]+)(?!\w*[(])", kaava) + haku = re.finditer(r"([a-zA-Z]+)(?!\w*[(])", kaava) numero = 1 for h in haku: muuttujat[h.group(1)] = Decimal(numero) diff --git a/web/tupa/TulosLaskin.py b/web/tupa/TulosLaskin.py index aff8a8be..7832a868 100644 --- a/web/tupa/TulosLaskin.py +++ b/web/tupa/TulosLaskin.py @@ -50,7 +50,7 @@ def korvaa(lause, pino, loppu=None): lause = re.sub(r"([^-.+*/()]+[.][.])", "", lause, count=1) poistoon = re.search(r"([^-.+*/()]+[.][.])", lause) haku = re.finditer( - "(?", s, re.UNICODE + r"(([.][^-,+*/ ]+)+)(\.[^-,+*/)(]*)(?![^-,+*/() ])", r"\g<1>", s, re.UNICODE ) muokattu = re.sub( - "(?", muokattu, re.UNICODE + r"(?", muokattu, re.UNICODE ) return muokattu From abe4011d5b4f487b3cac72e7289cfa0c2b36424d Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 26 Nov 2024 10:12:11 +0200 Subject: [PATCH 48/51] Upgrade Django to 5.0 --- docs/manual.md | 2 +- requirements.txt | 2 +- web/tupa/formit.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 2f27a02b..4dcac634 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -139,7 +139,7 @@ Vieraile tupa2.sf.net Imagen linkkiä varten. Kipan laskenta perustuu Pythonin-ohjelmointikielellä kirjoitettuun koodiin. Tällä hetkellä kehitysversiossa on käytössä Python 3.12. -Djangon versio 4.2 on testattu kehityspalvelimen kanssa toimivaksi. +Djangon versio 5.0 on testattu kehityspalvelimen kanssa toimivaksi. Apache-asennus ei toimi kehitysversiossa. diff --git a/requirements.txt b/requirements.txt index ff4d5f6b..3edd61ee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django==4.2 +django==5.0 #mysql-python # git+https://github.com/PyMySQL/mysqlclient-python.git@v1.4.6#egg=MySQLdb diff --git a/web/tupa/formit.py b/web/tupa/formit.py index 79e2ee34..ae8ad1a3 100644 --- a/web/tupa/formit.py +++ b/web/tupa/formit.py @@ -151,8 +151,8 @@ def __init__(self, helptext, *argcv): self.helptext = helptext def render(self, name, value=None, attrs=None, renderer=None): - return ( - mark_safe(super(HelpWidget, self).render(name, value, attrs, renderer)) + return mark_safe( + super(HelpWidget, self).render(name, value, attrs, renderer) + "' From 29055dcda48d30ed903d02e2f4833d26ed8a42bc Mon Sep 17 00:00:00 2001 From: Ilmari Marttila Date: Tue, 26 Nov 2024 10:44:37 +0200 Subject: [PATCH 49/51] Include referred tooltip.js sricpt to "new competition" page --- web/templates/tupa/base_riisuttu.html | 1 + 1 file changed, 1 insertion(+) diff --git a/web/templates/tupa/base_riisuttu.html b/web/templates/tupa/base_riisuttu.html index 30b978c9..da85cfef 100644 --- a/web/templates/tupa/base_riisuttu.html +++ b/web/templates/tupa/base_riisuttu.html @@ -6,6 +6,7 @@ {% block header %} {% endblock %} +

{{oikea.errors}} diff --git a/web/templates/tupa/forms/maksimi_suoritus.html b/web/templates/tupa/forms/maksimi_suoritus.html index 49b116be..86fd4fc8 100644 --- a/web/templates/tupa/forms/maksimi_suoritus.html +++ b/web/templates/tupa/forms/maksimi_suoritus.html @@ -9,13 +9,13 @@ Parhaat pisteet saa: