Skip to content
Snippets Groups Projects
Commit 27c78516 authored by Alexa Valentová's avatar Alexa Valentová
Browse files

finish basic career page

parent eedddccb
No related branches found
No related tags found
2 merge requests!1208Release,!1201Release career template test
Pipeline #20293 passed
Showing
with 444 additions and 241 deletions
...@@ -4,29 +4,36 @@ from django.db import migrations, models ...@@ -4,29 +4,36 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('district', '0303_alter_districtcenterpage_content'), ("district", "0303_alter_districtcenterpage_content"),
('shared', '0014_octopuspersonoriginatinggroup_and_more'), ("shared", "0014_octopuspersonoriginatinggroup_and_more"),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='districtoctopuspersonpage', model_name="districtoctopuspersonpage",
name='originating_group', name="originating_group",
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='districtoctopuspersonpage', model_name="districtoctopuspersonpage",
name='originating_team', name="originating_team",
), ),
migrations.AddField( migrations.AddField(
model_name='districtoctopuspersonpage', model_name="districtoctopuspersonpage",
name='originating_groups', name="originating_groups",
field=models.ManyToManyField(help_text='Skupiny, ze kterých byla tato osba importována.', to='shared.octopuspersonoriginatinggroup', verbose_name='Skupiny'), field=models.ManyToManyField(
help_text="Skupiny, ze kterých byla tato osba importována.",
to="shared.octopuspersonoriginatinggroup",
verbose_name="Skupiny",
),
), ),
migrations.AddField( migrations.AddField(
model_name='districtoctopuspersonpage', model_name="districtoctopuspersonpage",
name='originating_teams', name="originating_teams",
field=models.ManyToManyField(help_text='Týmy, ze kterých byla tato osba importována.', to='shared.octopuspersonoriginatingteam', verbose_name='Tým'), field=models.ManyToManyField(
help_text="Týmy, ze kterých byla tato osba importována.",
to="shared.octopuspersonoriginatingteam",
verbose_name="Tým",
),
), ),
] ]
...@@ -4,14 +4,16 @@ from django.db import migrations ...@@ -4,14 +4,16 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('district', '0304_remove_districtoctopuspersonpage_originating_group_and_more'), (
"district",
"0304_remove_districtoctopuspersonpage_originating_group_and_more",
),
] ]
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='districtcustompage', name="districtcustompage",
options={'verbose_name': 'Jednoduchá stránka'}, options={"verbose_name": "Jednoduchá stránka"},
), ),
] ]
...@@ -4,14 +4,13 @@ from django.db import migrations ...@@ -4,14 +4,13 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('elections', '0062_alter_electionsarticlepage_content'), ("elections", "0062_alter_electionsarticlepage_content"),
] ]
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='electionssimplepage', name="electionssimplepage",
options={'verbose_name': 'Jednoduchá stránka'}, options={"verbose_name": "Jednoduchá stránka"},
), ),
] ]
import os import os
import tempfile import tempfile
from django import forms from django import forms
from shared.forms import ArticlesPageForm as SharedArticlesPageForm from shared.forms import ArticlesPageForm as SharedArticlesPageForm
...@@ -8,8 +9,90 @@ from shared.forms import JekyllImportForm as SharedJekyllImportForm ...@@ -8,8 +9,90 @@ from shared.forms import JekyllImportForm as SharedJekyllImportForm
from .tasks import import_jekyll_articles from .tasks import import_jekyll_articles
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
class MultipleFileField(forms.FileField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)
def clean(self, data, initial=None):
single_file_clean = super().clean
if isinstance(data, (list, tuple)):
result = [single_file_clean(d, initial) for d in data]
else:
result = [single_file_clean(data, initial)]
return result
class CareerSubmissionForm(forms.Form): class CareerSubmissionForm(forms.Form):
pass name = forms.CharField(
min_length=1,
max_length=256,
required=True,
widget=forms.TextInput(
attrs={"placeholder": "Jméno", "class": "lg:w-auto w-full"}
),
)
surname = forms.CharField(
min_length=1,
max_length=256,
required=True,
widget=forms.TextInput(
attrs={"placeholder": "Příjmení", "class": "lg:w-auto w-full"}
),
)
email = forms.EmailField(
min_length=1,
max_length=256,
required=True,
widget=forms.EmailInput(attrs={"placeholder": "Email", "class": "w-full"}),
)
phone = forms.IntegerField(
required=True,
widget=forms.NumberInput(
attrs={"type": "tel", "placeholder": "Telefon", "class": "w-full"}
),
)
own_text = forms.CharField(
widget=forms.Textarea(
attrs={
"placeholder": "Vlastní text (nepovinný)",
"class": "w-full",
"rows": 3,
}
),
max_length=65535,
required=False,
)
cv_file = forms.FileField(
required=True,
widget=forms.FileInput(
attrs={"class": "max-w-64 mr-auto overflow-hidden break-words"}
),
)
cover_letter_file = forms.FileField(
required=True,
widget=forms.FileInput(
attrs={"class": "max-w-64 mr-auto overflow-hidden break-words"}
),
)
other_files = MultipleFileField(
widget=MultipleFileInput(
attrs={"class": "max-w-64 mr-auto overflow-hidden break-words"}
)
)
personal_data_agreement = forms.BooleanField(required=True)
class JekyllImportForm(SharedJekyllImportForm): class JekyllImportForm(SharedJekyllImportForm):
......
...@@ -4,14 +4,13 @@ from django.db import migrations ...@@ -4,14 +4,13 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('main', '0131_alter_mainarticlepage_content_and_more'), ("main", "0131_alter_mainarticlepage_content_and_more"),
] ]
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='mainsimplepage', name="mainsimplepage",
options={'verbose_name': 'Jednoduchá stránka'}, options={"verbose_name": "Jednoduchá stránka"},
), ),
] ]
# Generated by Django 5.0.7 on 2024-12-09 15:00 # Generated by Django 5.0.7 on 2024-12-09 15:00
import django.db.models.deletion import django.db.models.deletion
import shared.models.main
import wagtailmetadata.models import wagtailmetadata.models
from django.db import migrations, models from django.db import migrations, models
import shared.models.main
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('main', '0132_alter_mainsimplepage_options'), ("main", "0132_alter_mainsimplepage_options"),
('wagtailcore', '0094_alter_page_locale'), ("wagtailcore", "0094_alter_page_locale"),
('wagtailimages', '0026_delete_uploadedimage'), ("wagtailimages", "0026_delete_uploadedimage"),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='MainCareerPage', name="MainCareerPage",
fields=[ fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), (
('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')), "page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
(
"search_image",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="wagtailimages.image",
verbose_name="Search image",
),
),
], ],
options={ options={
'abstract': False, "abstract": False,
}, },
bases=(shared.models.main.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model), bases=(
shared.models.main.SubpageMixin,
wagtailmetadata.models.WagtailImageMetadataMixin,
"wagtailcore.page",
models.Model,
),
), ),
migrations.CreateModel( migrations.CreateModel(
name='MainCareersPage', name="MainCareersPage",
fields=[ fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), (
('search_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image', verbose_name='Search image')), "page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
(
"search_image",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="wagtailimages.image",
verbose_name="Search image",
),
),
], ],
options={ options={
'abstract': False, "abstract": False,
}, },
bases=(shared.models.main.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model), bases=(
shared.models.main.SubpageMixin,
wagtailmetadata.models.WagtailImageMetadataMixin,
"wagtailcore.page",
models.Model,
),
), ),
] ]
...@@ -4,18 +4,17 @@ from django.db import migrations ...@@ -4,18 +4,17 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('main', '0133_maincareerpage_maincareerspage'), ("main", "0133_maincareerpage_maincareerspage"),
] ]
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='maincareerpage', name="maincareerpage",
options={'verbose_name': 'Pracovní nabídka'}, options={"verbose_name": "Pracovní nabídka"},
), ),
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='maincareerspage', name="maincareerspage",
options={'verbose_name': 'Kariéry'}, options={"verbose_name": "Kariéry"},
), ),
] ]
# Generated by Django 5.0.7 on 2024-12-09 15:36 # Generated by Django 5.0.7 on 2024-12-09 15:36
import datetime import datetime
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('main', '0134_alter_maincareerpage_options_and_more'), ("main", "0134_alter_maincareerpage_options_and_more"),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='created_date', name="created_date",
field=models.DateField(default=datetime.date.today, verbose_name='Datum vytvoření'), field=models.DateField(
default=datetime.date.today, verbose_name="Datum vytvoření"
),
), ),
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='employment_relationship', name="employment_relationship",
field=models.CharField(default=None, help_text="Např. 'Rámcová smlouva na dobu určitou'", max_length=128, verbose_name='Poměr'), field=models.CharField(
default=None,
help_text="Např. 'Rámcová smlouva na dobu určitou'",
max_length=128,
verbose_name="Poměr",
),
preserve_default=False, preserve_default=False,
), ),
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='location', name="location",
field=models.CharField(default=None, help_text="Např. 'Středočeský kraj'", max_length=64, verbose_name='Místo výkonu práce'), field=models.CharField(
default=None,
help_text="Např. 'Středočeský kraj'",
max_length=64,
verbose_name="Místo výkonu práce",
),
preserve_default=False, preserve_default=False,
), ),
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='pay_rate', name="pay_rate",
field=models.CharField(default=None, help_text="Např. '300-350 Kč/h'", max_length=64, verbose_name='Odměna'), field=models.CharField(
default=None,
help_text="Např. '300-350 Kč/h'",
max_length=64,
verbose_name="Odměna",
),
preserve_default=False, preserve_default=False,
), ),
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='submission_end_date', name="submission_end_date",
field=models.DateField(default=None, verbose_name='Datum konce přihlášek'), field=models.DateField(default=None, verbose_name="Datum konce přihlášek"),
preserve_default=False, preserve_default=False,
), ),
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='time_cost', name="time_cost",
field=models.CharField(default=None, help_text="Např. '8h denně'", max_length=64, verbose_name='Časová náročnost'), field=models.CharField(
default=None,
help_text="Např. '8h denně'",
max_length=64,
verbose_name="Časová náročnost",
),
preserve_default=False, preserve_default=False,
), ),
] ]
...@@ -4,16 +4,19 @@ from django.db import migrations, models ...@@ -4,16 +4,19 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('main', '0135_maincareerpage_created_date_and_more'), ("main", "0135_maincareerpage_created_date_and_more"),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='category', name="category",
field=models.CharField(default='Bez kategorie', help_text="Např. 'Koordinátor/ka', 'Programátor/ka', 'Volební manažer/ka', ...", verbose_name='Kategorie pracovní pozice'), field=models.CharField(
default="Bez kategorie",
help_text="Např. 'Koordinátor/ka', 'Programátor/ka', 'Volební manažer/ka', ...",
verbose_name="Kategorie pracovní pozice",
),
preserve_default=False, preserve_default=False,
), ),
] ]
...@@ -4,25 +4,34 @@ from django.db import migrations, models ...@@ -4,25 +4,34 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('main', '0136_maincareerpage_category'), ("main", "0136_maincareerpage_category"),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='maincareerspage', model_name="maincareerspage",
name='perex_col_1', name="perex_col_1",
field=models.TextField(blank=True, null=True, verbose_name='Perex - první sloupec'), field=models.TextField(
blank=True, null=True, verbose_name="Perex - první sloupec"
),
), ),
migrations.AddField( migrations.AddField(
model_name='maincareerspage', model_name="maincareerspage",
name='perex_col_2', name="perex_col_2",
field=models.TextField(blank=True, null=True, verbose_name='Perex - druhý sloupec'), field=models.TextField(
blank=True, null=True, verbose_name="Perex - druhý sloupec"
),
), ),
migrations.AddField( migrations.AddField(
model_name='maincareerspage', model_name="maincareerspage",
name='subheading', name="subheading",
field=models.CharField(blank=True, help_text='Text pod hlavním nadpisem stránky', max_length=32, null=True, verbose_name='Podtitulek'), field=models.CharField(
blank=True,
help_text="Text pod hlavním nadpisem stránky",
max_length=32,
null=True,
verbose_name="Podtitulek",
),
), ),
] ]
...@@ -5,15 +5,14 @@ from django.db import migrations ...@@ -5,15 +5,14 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('main', '0137_maincareerspage_perex_col_1_and_more'), ("main", "0137_maincareerspage_perex_col_1_and_more"),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='maincareerpage', model_name="maincareerpage",
name='content', name="content",
field=wagtail.fields.RichTextField(blank=True, verbose_name='Text nabídky'), field=wagtail.fields.RichTextField(blank=True, verbose_name="Text nabídky"),
), ),
] ]
# Generated by Django 5.0.7 on 2024-12-10 16:50
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0138_maincareerpage_content'),
]
operations = [
migrations.AddField(
model_name='maincareerpage',
name='recipient_emails',
field=models.CharField(default='', help_text='Zadej buď jednu adresu, nebo víc, oddělených čárkami.', verbose_name='Příjemci emailů o nových přihláškách'),
preserve_default=False,
),
]
from datetime import date, datetime
from django.contrib import messages
from django.core.mail import EmailMessage
from django.db import models from django.db import models
from django.shortcuts import render
from modelcluster.contrib.taggit import ClusterTaggableManager from modelcluster.contrib.taggit import ClusterTaggableManager
from modelcluster.fields import ParentalKey, ParentalManyToManyField from modelcluster.fields import ParentalKey, ParentalManyToManyField
from taggit.models import TaggedItemBase from taggit.models import TaggedItemBase
...@@ -8,9 +13,6 @@ from wagtail.contrib.routable_page.models import route ...@@ -8,9 +13,6 @@ from wagtail.contrib.routable_page.models import route
from wagtail.fields import RichTextField, StreamField from wagtail.fields import RichTextField, StreamField
from wagtail.models import Page from wagtail.models import Page
from wagtailmetadata.models import MetadataPageMixin from wagtailmetadata.models import MetadataPageMixin
from datetime import date
from django.contrib import messages
from django.shortcuts import render
from shared import blocks as shared_blocks from shared import blocks as shared_blocks
from shared.const import RICH_TEXT_DEFAULT_FEATURES from shared.const import RICH_TEXT_DEFAULT_FEATURES
...@@ -34,7 +36,7 @@ from shared.models import ( # MenuMixin, ...@@ -34,7 +36,7 @@ from shared.models import ( # MenuMixin,
from shared.utils import make_promote_panels from shared.utils import make_promote_panels
from . import blocks from . import blocks
from .forms import MainArticlesPageForm, CareerSubmissionForm from .forms import CareerSubmissionForm, MainArticlesPageForm
class MainHomePage(MainHomePageMixin): class MainHomePage(MainHomePageMixin):
...@@ -95,7 +97,6 @@ class MainHomePage(MainHomePageMixin): ...@@ -95,7 +97,6 @@ class MainHomePage(MainHomePageMixin):
class Meta: class Meta:
verbose_name = "HomePage pirati.cz" verbose_name = "HomePage pirati.cz"
@property @property
def careers_page(self): def careers_page(self):
return self._first_subpage_of_type(MainCareersPage) return self._first_subpage_of_type(MainCareersPage)
...@@ -383,7 +384,7 @@ class MainCareersPage( ...@@ -383,7 +384,7 @@ class MainCareersPage(
help_text="Text pod hlavním nadpisem stránky", help_text="Text pod hlavním nadpisem stránky",
max_length=32, max_length=32,
blank=True, blank=True,
null=True null=True,
) )
perex_col_1 = models.TextField( perex_col_1 = models.TextField(
...@@ -416,26 +417,16 @@ class MainCareersPage( ...@@ -416,26 +417,16 @@ class MainCareersPage(
def get_career_categories(self) -> list[str]: def get_career_categories(self) -> list[str]:
return ( return (
MainCareerPage. MainCareerPage.objects.child_of(self)
objects. .live()
child_of(self). .distinct("category")
live(). .values_list("category", flat=True)
distinct("category"). .order_by("category")
values_list("category", flat=True). .all()
order_by("category").
all()
) )
def get_career_pages(self): def get_career_pages(self):
return ( return MainCareerPage.objects.child_of(self).live().all()
MainCareerPage.
objects.
child_of(self).
live().
all()
)
class Meta: class Meta:
verbose_name = "Kariéry" verbose_name = "Kariéry"
...@@ -444,11 +435,18 @@ class MainCareersPage( ...@@ -444,11 +435,18 @@ class MainCareersPage(
class MainCareerPage( class MainCareerPage(
ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page
): ):
recipient_emails = models.CharField(
verbose_name="Příjemci emailů o nových přihláškách",
help_text="Zadej buď jednu adresu, nebo víc, oddělených čárkami.",
blank=False,
null=False,
)
category = models.CharField( category = models.CharField(
verbose_name="Kategorie pracovní pozice", verbose_name="Kategorie pracovní pozice",
help_text="Např. 'Koordinátor/ka', 'Programátor/ka', 'Volební manažer/ka', ...", help_text="Např. 'Koordinátor/ka', 'Programátor/ka', 'Volební manažer/ka', ...",
blank=False, blank=False,
null=False null=False,
) )
location = models.CharField( location = models.CharField(
...@@ -456,7 +454,7 @@ class MainCareerPage( ...@@ -456,7 +454,7 @@ class MainCareerPage(
help_text="Např. 'Středočeský kraj'", help_text="Např. 'Středočeský kraj'",
max_length=64, max_length=64,
blank=False, blank=False,
null=False null=False,
) )
time_cost = models.CharField( time_cost = models.CharField(
...@@ -464,7 +462,7 @@ class MainCareerPage( ...@@ -464,7 +462,7 @@ class MainCareerPage(
help_text="Např. '8h denně'", help_text="Např. '8h denně'",
max_length=64, max_length=64,
blank=False, blank=False,
null=False null=False,
) )
employment_relationship = models.CharField( employment_relationship = models.CharField(
...@@ -472,7 +470,7 @@ class MainCareerPage( ...@@ -472,7 +470,7 @@ class MainCareerPage(
help_text="Např. 'Rámcová smlouva na dobu určitou'", help_text="Např. 'Rámcová smlouva na dobu určitou'",
max_length=128, max_length=128,
blank=False, blank=False,
null=False null=False,
) )
pay_rate = models.CharField( pay_rate = models.CharField(
...@@ -480,7 +478,7 @@ class MainCareerPage( ...@@ -480,7 +478,7 @@ class MainCareerPage(
help_text="Např. '300-350 Kč/h'", help_text="Např. '300-350 Kč/h'",
max_length=64, max_length=64,
blank=False, blank=False,
null=False null=False,
) )
submission_end_date = models.DateField( submission_end_date = models.DateField(
...@@ -490,16 +488,11 @@ class MainCareerPage( ...@@ -490,16 +488,11 @@ class MainCareerPage(
) )
created_date = models.DateField( created_date = models.DateField(
verbose_name="Datum vytvoření", verbose_name="Datum vytvoření", blank=False, null=False, default=date.today
blank=False,
null=False,
default=date.today
) )
content = RichTextField( content = RichTextField(
"Text nabídky", "Text nabídky", blank=True, features=RICH_TEXT_DEFAULT_FEATURES
blank=True,
features=RICH_TEXT_DEFAULT_FEATURES
) )
content_panels = Page.content_panels + [ content_panels = Page.content_panels + [
...@@ -508,15 +501,14 @@ class MainCareerPage( ...@@ -508,15 +501,14 @@ class MainCareerPage(
FieldPanel("submission_end_date"), FieldPanel("submission_end_date"),
FieldPanel("created_date"), FieldPanel("created_date"),
], ],
"Datumy" "Datumy",
), ),
FieldPanel("recipient_emails"),
FieldPanel("category"), FieldPanel("category"),
FieldPanel("location"), FieldPanel("location"),
FieldPanel("time_cost"), FieldPanel("time_cost"),
FieldPanel("employment_relationship"), FieldPanel("employment_relationship"),
FieldPanel("pay_rate"), FieldPanel("pay_rate"),
FieldPanel("content"), FieldPanel("content"),
] ]
...@@ -524,27 +516,93 @@ class MainCareerPage( ...@@ -524,27 +516,93 @@ class MainCareerPage(
def serve(self, request): def serve(self, request):
form = None form = None
current_time = datetime.now()
if request.method == 'POST': if request.method == "POST":
form = CareerSubmissionForm(request.POST) form = CareerSubmissionForm(request.POST, request.FILES)
if form.is_valid(): if form.is_valid():
# TODO other_files_names = ""
pass
for file in form.cleaned_data["other_files"]:
other_files_names += f" - {file.name}\n"
email = EmailMessage(
# Subject
f"Nová přihláška k pracovní pozici {self.title} - {form.cleaned_data['name']} {form.cleaned_data['surname']}",
# Message
(
f"""
K pracovní pozici {self.title} se {current_time} přihlásil nový zájemce.
Vyplněné údaje:
Jméno: {form.cleaned_data['name']}
Příjmení: {form.cleaned_data['surname']}
E-mail: {form.cleaned_data['email']}
Telefon: {form.cleaned_data['phone']}
Vlastní text: {form.cleaned_data['own_text'] if form.cleaned_data['own_text'] else '(nevyplněn)'}
CV, motivační dopis a ostatní soubory jsou v přílohách. Názvy souborů:
CV: {form.cleaned_data["cv_file"].name}
Mot. dopis: {form.cleaned_data["cover_letter_file"].name}
Ostatní soubory:
{other_files_names}
Při otevírání souborů buďte opatrní, virový sken neproběhl!
"""
),
# From email
"vyberka@pirati.cz",
# Recipient list
self.recipient_emails.split(","),
)
email.attach(
form.cleaned_data["cv_file"].name,
form.cleaned_data["cv_file"].read(),
form.cleaned_data["cv_file"].content_type,
)
email.attach(
form.cleaned_data["cover_letter_file"].name,
form.cleaned_data["cover_letter_file"].read(),
form.cleaned_data["cover_letter_file"].content_type,
)
for file in form.cleaned_data["other_files"]:
email.attach(file.name, file.read(), file.content_type)
sent_successfully = email.send(fail_silently=True)
if sent_successfully:
messages.add_message(
request, messages.SUCCESS, "Přihláška odeslána."
)
else:
messages.add_message( messages.add_message(
request, request,
messages.SUCCESS, messages.ERROR,
"Přihláška odeslána." "Chyba serveru při odesílání přihlášky.",
)
else:
messages.add_message(
request,
messages.ERROR,
"Chyba při odeslání přihlášky - prohlížeč odeslal chybná data.",
) )
else: else:
form = CareerSubmissionForm() form = CareerSubmissionForm()
return render(request, self.template, { return render(
'page': self, request,
'self': self, self.template,
'form': form, {
}) "page": self,
"self": self,
"form": form,
},
)
class Meta: class Meta:
verbose_name = "Pracovní nabídka" verbose_name = "Pracovní nabídka"
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
role="dialog" role="dialog"
aria-modal="true" aria-modal="true"
aria-labelledby="modal-1-title" aria-labelledby="modal-1-title"
enctype="multipart/form-data"
method="POST" method="POST"
action="" action=""
> >
...@@ -52,81 +53,38 @@ ...@@ -52,81 +53,38 @@
lg:flex-row lg:gap-2 lg:flex-row lg:gap-2
" "
> >
{% csrf_token %}
<div class="lg:w-auto w-full"> <div class="lg:w-auto w-full">
<input {{ form.name }}
type="text"
name="name"
maxlength="256"
placeholder="Jméno"
id="id_name"
class="lg:w-auto w-full"
required
>
</div> </div>
<div class="lg:w-auto w-full"> <div class="lg:w-auto w-full">
<input {{ form.surname }}
type="text"
name="surname"
maxlength="256"
placeholder="Příjmení"
id="id_surname"
class="lg:w-auto w-full"
required
>
</div> </div>
</section> </section>
<section> <section>
<div class="w-full"> <div class="w-full">
<input {{ form.email }}
class="w-full"
type="email"
name="email"
maxlength="256"
id="id_email"
placeholder="E-mail"
required
>
</div> </div>
</section> </section>
<section> <section>
<div class="w-full"> <div class="w-full">
<input {{ form.phone }}
class="w-full"
type="tel"
name="phone"
maxlength="19"
id="id_phone"
placeholder="Telefon"
required
>
</div> </div>
</section> </section>
<section> <section>
<div class="w-full"> <div class="w-full">
<textarea {{ form.own_text }}
class="w-full"
name="custom_text"
maxlength="65535"
id="id_custom_text"
placeholder="Vlastní text (nepovinný)"
></textarea>
</div> </div>
</section> </section>
<section class="flex flex-col gap-3 lg:items-center lg:flex-row"> <section class="flex flex-col gap-3 lg:items-center lg:flex-row">
<label <label
class="w-36" class="w-36"
for="cv" for="id_cv"
id="cv_label" id="cv_label"
>CV: </label> >CV: </label>
<input {{ form.cv_file }}
type="file"
id="cv"
name="cv"
aria-labelledby="cv_label"
class="max-w-64 mr-auto overflow-hidden break-words"
required
>
<small class="text-grey-300">(Povinné)</small> <small class="text-grey-300">(Povinné)</small>
</section> </section>
...@@ -134,17 +92,10 @@ ...@@ -134,17 +92,10 @@
<label <label
class="w-36" class="w-36"
id="cover_letter_label" id="cover_letter_label"
for="cover_letter" for="id_cover_letter_file"
>Mot. dopis: </label> >Mot. dopis: </label>
<input {{ form.cover_letter_file }}
type="file"
id="cover_letter"
name="cover_letter"
aria-labelledby="cover_letter_label"
class="max-w-64 mr-auto overflow-hidden break-words"
required
>
<small class="text-grey-300">(Povinný)</small> <small class="text-grey-300">(Povinný)</small>
</section> </section>
...@@ -152,30 +103,17 @@ ...@@ -152,30 +103,17 @@
<label <label
class="w-36" class="w-36"
id="other_files_label" id="other_files_label"
for="other_files" for="id_other_files"
>Ostatní soubory: </label> >Ostatní soubory: </label>
<input {{ form.other_files }}
type="file"
id="other_files"
name="other_files"
aria-labelledby="other_files_label"
class="max-w-64 mr-auto overflow-hidden break-words"
multiple
>
</section> </section>
<section class="flex flex-row gap-3 items-start leading-none"> <section class="flex flex-row gap-3 items-start leading-none">
<input {{ form.personal_data_agreement }}
type="checkbox"
id="personal_data_agreement"
name="personal_data_agreement"
aria-labelledby="personal_data_agreement_label"
required
>
<label <label
for="personal_data_agreement" for="id_personal_data_agreement"
>Souhlasím se zpracováním osobním údajů (povinné)</label> >Souhlasím se zpracováním osobním údajů (povinné)</label>
</section> </section>
</div> </div>
...@@ -191,7 +129,7 @@ ...@@ -191,7 +129,7 @@
{% include "styleguide2/includes/atoms/buttons/round_button_form.html" with type="button" text="Zrušit" show_arrow_on_hover=True %} {% include "styleguide2/includes/atoms/buttons/round_button_form.html" with type="button" text="Zrušit" show_arrow_on_hover=True %}
</div> </div>
<div> <div>
{% include "styleguide2/includes/atoms/buttons/round_button_form.html" with type="submit" fill="#fff" classes="bg-pirati-yellow text-black" text="Odeslat přihlášku" %} {% include "styleguide2/includes/atoms/buttons/round_button_form.html" with type="submit" fill="#fff" classes="bg-pirati-yellow text-black" text="Odeslat přihlášku" show_arrow_on_hover=True %}
</div> </div>
</footer> </footer>
</form> </form>
......
...@@ -173,6 +173,7 @@ EMAIL_HOST_USER = env.str("EMAIL_HOST_USER", "") ...@@ -173,6 +173,7 @@ EMAIL_HOST_USER = env.str("EMAIL_HOST_USER", "")
EMAIL_HOST_PASSWORD = env.str("EMAIL_HOST_PASSWORD", "") EMAIL_HOST_PASSWORD = env.str("EMAIL_HOST_PASSWORD", "")
EMAIL_PORT = env.str("EMAIL_PORT", "") EMAIL_PORT = env.str("EMAIL_PORT", "")
EMAIL_SUBJECT_PREFIX = env.str("EMAIL_SUBJECT_PREFIX", "[Piráti] ") EMAIL_SUBJECT_PREFIX = env.str("EMAIL_SUBJECT_PREFIX", "[Piráti] ")
EMAIL_USE_TLS = env.bool("EMAIL_USE_TLS", False)
# LOGGING # LOGGING
......
...@@ -4,24 +4,39 @@ from django.db import migrations, models ...@@ -4,24 +4,39 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('shared', '0013_alter_octopusperson_order'), ("shared", "0013_alter_octopusperson_order"),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='OctopusPersonOriginatingGroup', name="OctopusPersonOriginatingGroup",
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), (
('name', models.CharField(max_length=128)), "id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=128)),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='OctopusPersonOriginatingTeam', name="OctopusPersonOriginatingTeam",
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), (
('name', models.CharField(max_length=128)), "id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=128)),
], ],
), ),
] ]
...@@ -7,8 +7,8 @@ import requests ...@@ -7,8 +7,8 @@ import requests
from django.conf import settings from django.conf import settings
from django.core.files.images import ImageFile from django.core.files.images import ImageFile
from gql import Client, gql from gql import Client, gql
from gql.transport.exceptions import TransportServerError
from gql.transport.aiohttp import AIOHTTPTransport from gql.transport.aiohttp import AIOHTTPTransport
from gql.transport.exceptions import TransportServerError
from wagtail.images.models import Image from wagtail.images.models import Image
from wagtail.models.media import Collection from wagtail.models.media import Collection
...@@ -480,7 +480,7 @@ class PeopleTeamImporter(ImporterMixin): ...@@ -480,7 +480,7 @@ class PeopleTeamImporter(ImporterMixin):
logger.warning( logger.warning(
f"Error getting data for group %s: %s", f"Error getting data for group %s: %s",
self.team_shortcut, self.team_shortcut,
str(exception) str(exception),
) )
return [] return []
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment