Skip to content

Commit 2cebc15

Browse files
MasloMaslaneSZonkilgeoff128jrozek
authored
Implement db saving (#13)
* Some `save_db()` code * Complete from_db * Add tests * Reformat * regex refactor * Create common django app * Fix string * Change multi line output * reversing changes in pyproject.toml * fix previous commit --------- Co-authored-by: Zonkil <[email protected]> Co-authored-by: Tomasz Kwiatkowski <[email protected]> Co-authored-by: jrozek <[email protected]>
1 parent 7cf0998 commit 2cebc15

File tree

24 files changed

+823
-52
lines changed

24 files changed

+823
-52
lines changed

.github/workflows/formatter.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ jobs:
1919
pip install isort black
2020
- name: Run isort and black
2121
run: |
22-
isort -c .
23-
black --check .
22+
isort -c src tests
23+
black --check src tests

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@ htmlcov
1313
coverage.xml
1414

1515
# macOS
16-
.DS_Store
16+
.DS_Store
17+
18+
# Files from Django db
19+
/sio3pack

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ build-backend = "setuptools.build_meta"
44

55
[tool.isort]
66
line_length = 120
7-
multi_line_output = 1
7+
multi_line_output = 3
88
include_trailing_comma = true
9+
skip = ["migrations", ".venv"]
910

1011
[tool.black]
1112
line_length = 120

src/sio3pack/django/common/handler.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from typing import Type
2+
3+
from django.core.files import File
4+
from django.db import transaction
5+
6+
from sio3pack.django.common.models import SIO3Package, SIO3PackModelSolution, SIO3PackNameTranslation, SIO3PackStatement
7+
from sio3pack.files.local_file import LocalFile
8+
from sio3pack.packages.exceptions import ImproperlyConfigured, PackageAlreadyExists
9+
10+
11+
class DjangoHandler:
12+
def __init__(self, package: Type["Package"], problem_id: int):
13+
self.package = package
14+
self.problem_id = problem_id
15+
self.db_package = None
16+
17+
@transaction.atomic
18+
def save_to_db(self):
19+
"""
20+
Save the package to the database.
21+
"""
22+
if SIO3Package.objects.filter(problem_id=self.problem_id).exists():
23+
raise PackageAlreadyExists(self.problem_id)
24+
25+
self.db_package = SIO3Package.objects.create(
26+
problem_id=self.problem_id,
27+
short_name=self.package.short_name,
28+
full_name=self.package.full_name,
29+
)
30+
31+
self._save_translated_titles()
32+
self._save_model_solutions()
33+
self._save_problem_statements()
34+
35+
def _save_translated_titles(self):
36+
"""
37+
Save the translated titles to the database.
38+
"""
39+
for lang, title in self.package.get_titles().items():
40+
SIO3PackNameTranslation.objects.create(
41+
package=self.db_package,
42+
language=lang,
43+
name=title,
44+
)
45+
46+
def _save_model_solutions(self):
47+
for order, solution in enumerate(self.package.get_model_solutions()):
48+
instance = SIO3PackModelSolution(
49+
package=self.db_package,
50+
name=solution.filename,
51+
order_key=order,
52+
)
53+
instance.source_file.save(solution.filename, File(open(solution.path, "rb")))
54+
55+
def _save_problem_statements(self):
56+
def _add_statement(language: str, statement: LocalFile):
57+
instance = SIO3PackStatement(
58+
package=self.db_package,
59+
language=language,
60+
)
61+
instance.content.save(statement.filename, File(open(statement.path, "rb")))
62+
63+
if self.package.get_statement():
64+
_add_statement("", self.package.get_statement())
65+
for lang, statement in self.package.get_statements().items():
66+
_add_statement(lang, statement)
Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
# Generated by Django 5.1.4 on 2024-12-12 10:46
2+
3+
import django.db.models.deletion
4+
import sio3pack.django.common.models
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
initial = True
11+
12+
dependencies = []
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="SIO3Package",
17+
fields=[
18+
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
19+
("problem_id", models.IntegerField()),
20+
("short_name", models.CharField(max_length=30, verbose_name="short name")),
21+
("full_name", models.CharField(default="", max_length=255, verbose_name="full name")),
22+
],
23+
),
24+
migrations.CreateModel(
25+
name="SIO3PackModelSolution",
26+
fields=[
27+
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
28+
("name", models.CharField(max_length=255, verbose_name="name")),
29+
(
30+
"source_file",
31+
models.FileField(
32+
upload_to=sio3pack.django.common.models.make_problem_filename, verbose_name="source file"
33+
),
34+
),
35+
("order_key", models.IntegerField(default=0)),
36+
("package", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="common.sio3package")),
37+
],
38+
),
39+
migrations.CreateModel(
40+
name="SIO3PackStatement",
41+
fields=[
42+
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
43+
(
44+
"language",
45+
models.CharField(
46+
blank=True,
47+
choices=[
48+
("af", "Afrikaans"),
49+
("ar", "Arabic"),
50+
("ar-dz", "Algerian Arabic"),
51+
("ast", "Asturian"),
52+
("az", "Azerbaijani"),
53+
("bg", "Bulgarian"),
54+
("be", "Belarusian"),
55+
("bn", "Bengali"),
56+
("br", "Breton"),
57+
("bs", "Bosnian"),
58+
("ca", "Catalan"),
59+
("ckb", "Central Kurdish (Sorani)"),
60+
("cs", "Czech"),
61+
("cy", "Welsh"),
62+
("da", "Danish"),
63+
("de", "German"),
64+
("dsb", "Lower Sorbian"),
65+
("el", "Greek"),
66+
("en", "English"),
67+
("en-au", "Australian English"),
68+
("en-gb", "British English"),
69+
("eo", "Esperanto"),
70+
("es", "Spanish"),
71+
("es-ar", "Argentinian Spanish"),
72+
("es-co", "Colombian Spanish"),
73+
("es-mx", "Mexican Spanish"),
74+
("es-ni", "Nicaraguan Spanish"),
75+
("es-ve", "Venezuelan Spanish"),
76+
("et", "Estonian"),
77+
("eu", "Basque"),
78+
("fa", "Persian"),
79+
("fi", "Finnish"),
80+
("fr", "French"),
81+
("fy", "Frisian"),
82+
("ga", "Irish"),
83+
("gd", "Scottish Gaelic"),
84+
("gl", "Galician"),
85+
("he", "Hebrew"),
86+
("hi", "Hindi"),
87+
("hr", "Croatian"),
88+
("hsb", "Upper Sorbian"),
89+
("hu", "Hungarian"),
90+
("hy", "Armenian"),
91+
("ia", "Interlingua"),
92+
("id", "Indonesian"),
93+
("ig", "Igbo"),
94+
("io", "Ido"),
95+
("is", "Icelandic"),
96+
("it", "Italian"),
97+
("ja", "Japanese"),
98+
("ka", "Georgian"),
99+
("kab", "Kabyle"),
100+
("kk", "Kazakh"),
101+
("km", "Khmer"),
102+
("kn", "Kannada"),
103+
("ko", "Korean"),
104+
("ky", "Kyrgyz"),
105+
("lb", "Luxembourgish"),
106+
("lt", "Lithuanian"),
107+
("lv", "Latvian"),
108+
("mk", "Macedonian"),
109+
("ml", "Malayalam"),
110+
("mn", "Mongolian"),
111+
("mr", "Marathi"),
112+
("ms", "Malay"),
113+
("my", "Burmese"),
114+
("nb", "Norwegian Bokmål"),
115+
("ne", "Nepali"),
116+
("nl", "Dutch"),
117+
("nn", "Norwegian Nynorsk"),
118+
("os", "Ossetic"),
119+
("pa", "Punjabi"),
120+
("pl", "Polish"),
121+
("pt", "Portuguese"),
122+
("pt-br", "Brazilian Portuguese"),
123+
("ro", "Romanian"),
124+
("ru", "Russian"),
125+
("sk", "Slovak"),
126+
("sl", "Slovenian"),
127+
("sq", "Albanian"),
128+
("sr", "Serbian"),
129+
("sr-latn", "Serbian Latin"),
130+
("sv", "Swedish"),
131+
("sw", "Swahili"),
132+
("ta", "Tamil"),
133+
("te", "Telugu"),
134+
("tg", "Tajik"),
135+
("th", "Thai"),
136+
("tk", "Turkmen"),
137+
("tr", "Turkish"),
138+
("tt", "Tatar"),
139+
("udm", "Udmurt"),
140+
("ug", "Uyghur"),
141+
("uk", "Ukrainian"),
142+
("ur", "Urdu"),
143+
("uz", "Uzbek"),
144+
("vi", "Vietnamese"),
145+
("zh-hans", "Simplified Chinese"),
146+
("zh-hant", "Traditional Chinese"),
147+
],
148+
max_length=7,
149+
null=True,
150+
verbose_name="language code",
151+
),
152+
),
153+
(
154+
"content",
155+
models.FileField(
156+
upload_to=sio3pack.django.common.models.make_problem_filename, verbose_name="content"
157+
),
158+
),
159+
("package", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="common.sio3package")),
160+
],
161+
options={
162+
"verbose_name": "problem statement",
163+
"verbose_name_plural": "problem statements",
164+
},
165+
),
166+
migrations.CreateModel(
167+
name="SIO3PackNameTranslation",
168+
fields=[
169+
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
170+
(
171+
"language",
172+
models.CharField(
173+
choices=[
174+
("af", "Afrikaans"),
175+
("ar", "Arabic"),
176+
("ar-dz", "Algerian Arabic"),
177+
("ast", "Asturian"),
178+
("az", "Azerbaijani"),
179+
("bg", "Bulgarian"),
180+
("be", "Belarusian"),
181+
("bn", "Bengali"),
182+
("br", "Breton"),
183+
("bs", "Bosnian"),
184+
("ca", "Catalan"),
185+
("ckb", "Central Kurdish (Sorani)"),
186+
("cs", "Czech"),
187+
("cy", "Welsh"),
188+
("da", "Danish"),
189+
("de", "German"),
190+
("dsb", "Lower Sorbian"),
191+
("el", "Greek"),
192+
("en", "English"),
193+
("en-au", "Australian English"),
194+
("en-gb", "British English"),
195+
("eo", "Esperanto"),
196+
("es", "Spanish"),
197+
("es-ar", "Argentinian Spanish"),
198+
("es-co", "Colombian Spanish"),
199+
("es-mx", "Mexican Spanish"),
200+
("es-ni", "Nicaraguan Spanish"),
201+
("es-ve", "Venezuelan Spanish"),
202+
("et", "Estonian"),
203+
("eu", "Basque"),
204+
("fa", "Persian"),
205+
("fi", "Finnish"),
206+
("fr", "French"),
207+
("fy", "Frisian"),
208+
("ga", "Irish"),
209+
("gd", "Scottish Gaelic"),
210+
("gl", "Galician"),
211+
("he", "Hebrew"),
212+
("hi", "Hindi"),
213+
("hr", "Croatian"),
214+
("hsb", "Upper Sorbian"),
215+
("hu", "Hungarian"),
216+
("hy", "Armenian"),
217+
("ia", "Interlingua"),
218+
("id", "Indonesian"),
219+
("ig", "Igbo"),
220+
("io", "Ido"),
221+
("is", "Icelandic"),
222+
("it", "Italian"),
223+
("ja", "Japanese"),
224+
("ka", "Georgian"),
225+
("kab", "Kabyle"),
226+
("kk", "Kazakh"),
227+
("km", "Khmer"),
228+
("kn", "Kannada"),
229+
("ko", "Korean"),
230+
("ky", "Kyrgyz"),
231+
("lb", "Luxembourgish"),
232+
("lt", "Lithuanian"),
233+
("lv", "Latvian"),
234+
("mk", "Macedonian"),
235+
("ml", "Malayalam"),
236+
("mn", "Mongolian"),
237+
("mr", "Marathi"),
238+
("ms", "Malay"),
239+
("my", "Burmese"),
240+
("nb", "Norwegian Bokmål"),
241+
("ne", "Nepali"),
242+
("nl", "Dutch"),
243+
("nn", "Norwegian Nynorsk"),
244+
("os", "Ossetic"),
245+
("pa", "Punjabi"),
246+
("pl", "Polish"),
247+
("pt", "Portuguese"),
248+
("pt-br", "Brazilian Portuguese"),
249+
("ro", "Romanian"),
250+
("ru", "Russian"),
251+
("sk", "Slovak"),
252+
("sl", "Slovenian"),
253+
("sq", "Albanian"),
254+
("sr", "Serbian"),
255+
("sr-latn", "Serbian Latin"),
256+
("sv", "Swedish"),
257+
("sw", "Swahili"),
258+
("ta", "Tamil"),
259+
("te", "Telugu"),
260+
("tg", "Tajik"),
261+
("th", "Thai"),
262+
("tk", "Turkmen"),
263+
("tr", "Turkish"),
264+
("tt", "Tatar"),
265+
("udm", "Udmurt"),
266+
("ug", "Uyghur"),
267+
("uk", "Ukrainian"),
268+
("ur", "Urdu"),
269+
("uz", "Uzbek"),
270+
("vi", "Vietnamese"),
271+
("zh-hans", "Simplified Chinese"),
272+
("zh-hant", "Traditional Chinese"),
273+
],
274+
max_length=7,
275+
verbose_name="language code",
276+
),
277+
),
278+
("name", models.CharField(max_length=255, verbose_name="name translation")),
279+
("package", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="common.sio3package")),
280+
],
281+
options={
282+
"verbose_name": "sio3pack's name translation",
283+
"verbose_name_plural": "sio3pack's name translations",
284+
"unique_together": {("package", "language")},
285+
},
286+
),
287+
]

src/sio3pack/django/common/migrations/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)