From c8d147b656763127f3f2cd849608be83748b8b77 Mon Sep 17 00:00:00 2001 From: Emilie Date: Fri, 9 Sep 2016 10:26:29 +0200 Subject: [PATCH] JobOffer : creating app JOB and adding fixture loading in app.sh --- app/local_settings.py | 2 +- app/organization/job/__init__.py | 10 +++ app/organization/job/admin.py | 13 ++++ app/organization/job/apps.py | 7 ++ .../job/fixtures/organization-job.json | 1 + app/organization/job/forms.py | 17 +++++ .../migrations/0001_initial.py} | 20 ++++-- app/organization/job/migrations/__init__.py | 0 app/organization/job/models.py | 35 ++++++++++ app/organization/job/tests.py | 3 + app/organization/job/translation.py | 10 +++ app/organization/job/urls.py | 18 +++++ app/organization/job/views.py | 57 ++++++++++++++++ app/organization/pages/admin.py | 10 +-- app/organization/pages/forms.py | 13 +--- .../migrations/0003_auto_20160907_1151.py | 25 ------- .../migrations/0004_auto_20160907_1153.py | 26 -------- .../migrations/0005_auto_20160907_1529.py | 21 ------ .../migrations/0006_auto_20160908_1032.py | 34 ---------- .../migrations/0007_auto_20160908_1518.py | 25 ------- .../migrations/0008_auto_20160908_1602.py | 27 -------- app/organization/pages/models.py | 28 -------- app/organization/pages/translation.py | 5 -- app/organization/pages/urls.py | 8 +-- app/organization/pages/views.py | 65 +------------------ app/organization/urls.py | 1 + app/scripts/app.sh | 2 + app/settings.py | 1 + .../joboffer => job}/inc/job_offer_card.html | 0 .../inc/job_response_form.html | 0 .../joboffer => job}/job_offer_detail.html | 2 +- .../joboffer => job}/job_offer_list.html | 2 +- 32 files changed, 197 insertions(+), 291 deletions(-) create mode 100644 app/organization/job/__init__.py create mode 100644 app/organization/job/admin.py create mode 100644 app/organization/job/apps.py create mode 100644 app/organization/job/fixtures/organization-job.json create mode 100644 app/organization/job/forms.py rename app/organization/{pages/migrations/0002_joboffer_jobresponse.py => job/migrations/0001_initial.py} (76%) create mode 100644 app/organization/job/migrations/__init__.py create mode 100644 app/organization/job/models.py create mode 100644 app/organization/job/tests.py create mode 100644 app/organization/job/translation.py create mode 100644 app/organization/job/urls.py create mode 100644 app/organization/job/views.py delete mode 100644 app/organization/pages/migrations/0003_auto_20160907_1151.py delete mode 100644 app/organization/pages/migrations/0004_auto_20160907_1153.py delete mode 100644 app/organization/pages/migrations/0005_auto_20160907_1529.py delete mode 100644 app/organization/pages/migrations/0006_auto_20160908_1032.py delete mode 100644 app/organization/pages/migrations/0007_auto_20160908_1518.py delete mode 100644 app/organization/pages/migrations/0008_auto_20160908_1602.py rename app/templates/{pages/joboffer => job}/inc/job_offer_card.html (100%) rename app/templates/{pages/joboffer => job}/inc/job_response_form.html (100%) rename app/templates/{pages/joboffer => job}/job_offer_detail.html (88%) rename app/templates/{pages/joboffer => job}/job_offer_list.html (91%) diff --git a/app/local_settings.py b/app/local_settings.py index c1f9e86a..6883ac3c 100644 --- a/app/local_settings.py +++ b/app/local_settings.py @@ -69,7 +69,7 @@ SITE_TAGLINE = 'Institut de Recherche et de Coordination Acoustique et Musique' SILENCED_SYSTEM_CHECKS = ['fields.W342',] ADMIN_MENU_ORDER = ( - (_('Pages'), ('pages.Page', 'organization-pages.Home', 'organization-pages.JobOffer')), + (_('Pages'), ('pages.Page', 'organization-pages.Home', 'organization-job.JobOffer')), (_('Media'), ('organization-media.Video', 'organization-media.VideoCategory', 'organization-media.Audio', 'organization-media.Playlist', (_('Media Library'), 'fb_browse'),)), (_('Events'), ('mezzanine_agenda.Event', 'mezzanine_agenda.EventLocation', 'mezzanine_agenda.EventPrice', 'mezzanine_agenda.EventCategory')), (_('Magazine'), ('organization-magazine.Article', 'organization-magazine.Brief',)), diff --git a/app/organization/job/__init__.py b/app/organization/job/__init__.py new file mode 100644 index 00000000..97d1ce65 --- /dev/null +++ b/app/organization/job/__init__.py @@ -0,0 +1,10 @@ +""" +Provides abstract models and admin features used throughout the various +Mezzanine apps. +""" +from __future__ import unicode_literals + +from mezzanine import __version__ # noqa + + +default_app_config = 'organization.job.apps.OrganizationJobConfig' diff --git a/app/organization/job/admin.py b/app/organization/job/admin.py new file mode 100644 index 00000000..cbeef7b3 --- /dev/null +++ b/app/organization/job/admin.py @@ -0,0 +1,13 @@ +from django.contrib import admin +from mezzanine.utils.static import static_lazy as static +from copy import deepcopy +from mezzanine.core.admin import * +from organization.job.models import JobOffer + + +class JobOfferAdminDisplayable(BaseTranslationModelAdmin): + + model = JobOffer + + +admin.site.register(JobOffer, JobOfferAdminDisplayable) diff --git a/app/organization/job/apps.py b/app/organization/job/apps.py new file mode 100644 index 00000000..d3404908 --- /dev/null +++ b/app/organization/job/apps.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals + +from django.apps import AppConfig + +class OrganizationJobConfig(AppConfig): + name = 'organization.job' + label = 'organization-job' diff --git a/app/organization/job/fixtures/organization-job.json b/app/organization/job/fixtures/organization-job.json new file mode 100644 index 00000000..a17da885 --- /dev/null +++ b/app/organization/job/fixtures/organization-job.json @@ -0,0 +1 @@ +[{"model": "organization-job.joboffer", "pk": 1, "fields": {"keywords_string": "", "site": 1, "title": "Candidature Spontan\u00e9e", "title_fr": "Candidature Spontan\u00e9e", "title_en": "", "slug": "candidature-spontanee", "_meta_title": "", "description": "Nec minus feminae quoque calamitatum participes fuere similium. nam ex hoc quoque sexu peremptae sunt originis altae conplures, adulteriorum flagitiis obnoxiae vel stuprorum. inter quas notiores fuere Claritas et Flaviana, quarum altera cum duceretur ad mortem, indumento, quo vestita erat, abrepto, ne velemen quidem secreto membrorum sufficiens retinere permissa est. ideoque carnifex nefas admisisse convictus inmane, vivus exustus est.", "gen_description": true, "created": "2016-09-09T08:07:31.034Z", "updated": "2016-09-09T08:07:31.034Z", "status": 2, "publish_date": "2016-09-09T08:07:31.022Z", "expiry_date": null, "short_url": "", "in_sitemap": true, "content": "

Nec minus feminae quoque calamitatum participes fuere similium. nam ex hoc quoque sexu peremptae sunt originis altae conplures, adulteriorum flagitiis obnoxiae vel stuprorum. inter quas notiores fuere Claritas et Flaviana, quarum altera cum duceretur ad mortem, indumento, quo vestita erat, abrepto, ne velemen quidem secreto membrorum sufficiens retinere permissa est. ideoque carnifex nefas admisisse convictus inmane, vivus exustus est.

", "content_fr": "

Nec minus feminae quoque calamitatum participes fuere similium. nam ex hoc quoque sexu peremptae sunt originis altae conplures, adulteriorum flagitiis obnoxiae vel stuprorum. inter quas notiores fuere Claritas et Flaviana, quarum altera cum duceretur ad mortem, indumento, quo vestita erat, abrepto, ne velemen quidem secreto membrorum sufficiens retinere permissa est. ideoque carnifex nefas admisisse convictus inmane, vivus exustus est.

", "content_en": "", "email": "zawadzki@ircam.fr", "type": ""}}] \ No newline at end of file diff --git a/app/organization/job/forms.py b/app/organization/job/forms.py new file mode 100644 index 00000000..c37e8ba0 --- /dev/null +++ b/app/organization/job/forms.py @@ -0,0 +1,17 @@ +from dal import autocomplete + +from django import forms +from django.forms.widgets import HiddenInput +from django.forms import ModelForm +from organization.job.models import JobResponse + + +class JobResponseForm(ModelForm): + + def __init__(self, *args, **kwargs): + super(JobResponseForm, self).__init__(*args, **kwargs) + self.fields['job_offer'].widget = forms.HiddenInput() + + class Meta: + model = JobResponse + fields = ['first_name', 'last_name', 'email', 'curriculum_vitae', 'cover_letter', 'job_offer'] diff --git a/app/organization/pages/migrations/0002_joboffer_jobresponse.py b/app/organization/job/migrations/0001_initial.py similarity index 76% rename from app/organization/pages/migrations/0002_joboffer_jobresponse.py rename to app/organization/job/migrations/0001_initial.py index a82cecf1..c8b648b5 100644 --- a/app/organization/pages/migrations/0002_joboffer_jobresponse.py +++ b/app/organization/job/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-09-07 09:38 +# Generated by Django 1.9.7 on 2016-09-09 07:50 from __future__ import unicode_literals from django.db import migrations, models @@ -9,9 +9,10 @@ import mezzanine.core.fields class Migration(migrations.Migration): + initial = True + dependencies = [ ('sites', '0002_alter_domain_unique'), - ('organization-pages', '0001_initial'), ] operations = [ @@ -21,6 +22,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('keywords_string', models.CharField(blank=True, editable=False, max_length=500)), ('title', models.CharField(max_length=500, verbose_name='Title')), + ('title_fr', models.CharField(max_length=500, null=True, verbose_name='Title')), + ('title_en', models.CharField(max_length=500, null=True, verbose_name='Title')), ('slug', models.CharField(blank=True, help_text='Leave blank to have the URL auto-generated from the title.', max_length=2000, null=True, verbose_name='URL')), ('_meta_title', models.CharField(blank=True, help_text='Optional title to be used in the HTML title tag. If left blank, the main title field will be used.', max_length=500, null=True, verbose_name='Title')), ('description', models.TextField(blank=True, verbose_name='Description')), @@ -32,13 +35,16 @@ class Migration(migrations.Migration): ('expiry_date', models.DateTimeField(blank=True, help_text="With Published chosen, won't be shown after this time", null=True, verbose_name='Expires on')), ('short_url', models.URLField(blank=True, null=True)), ('in_sitemap', models.BooleanField(default=True, verbose_name='Show in sitemap')), + ('content', mezzanine.core.fields.RichTextField(verbose_name='Content')), + ('content_fr', mezzanine.core.fields.RichTextField(null=True, verbose_name='Content')), + ('content_en', mezzanine.core.fields.RichTextField(null=True, verbose_name='Content')), ('email', models.EmailField(max_length=255, verbose_name='Email to forward response')), ('type', models.CharField(blank=True, choices=[('internship', 'internship'), ('job', 'job')], max_length=32, verbose_name='Job offer type')), ('site', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), ], options={ - 'verbose_name': 'job_offer', - 'verbose_name_plural': 'job_offer', + 'verbose_name': 'job offer', + 'verbose_name_plural': 'job offers', }, ), migrations.CreateModel( @@ -48,9 +54,9 @@ class Migration(migrations.Migration): ('first_name', models.CharField(max_length=255, verbose_name='first name')), ('last_name', models.CharField(max_length=255, verbose_name='last name')), ('email', models.EmailField(max_length=255, verbose_name='email')), - ('curriculum_vitae', mezzanine.core.fields.FileField(max_length=1024, verbose_name='curriculum_vitae')), - ('cover_letter', mezzanine.core.fields.FileField(max_length=1024, verbose_name='curriculum_vitae')), - ('job_offer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='organization-pages.JobOffer', verbose_name='job offer')), + ('curriculum_vitae', models.FileField(max_length=1024, upload_to='job_responses/%Y/%m/%d/', verbose_name='curriculum vitae')), + ('cover_letter', models.FileField(max_length=1024, upload_to='job_responses/%Y/%m/%d/', verbose_name='cover letter')), + ('job_offer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='job_response', to='organization-job.JobOffer', verbose_name='job offer')), ], options={ 'verbose_name': 'job_reponse', diff --git a/app/organization/job/migrations/__init__.py b/app/organization/job/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/organization/job/models.py b/app/organization/job/models.py new file mode 100644 index 00000000..8f608fd5 --- /dev/null +++ b/app/organization/job/models.py @@ -0,0 +1,35 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from django.core.urlresolvers import reverse, reverse_lazy +from mezzanine.core.models import Displayable +from organization.core.models import * +from organization.media.models import * + +class JobResponse(models.Model): + + first_name = models.CharField(max_length=255, null=False, verbose_name=_('first name')) + last_name = models.CharField(max_length=255, null=False, verbose_name=_('last name')) + email = models.EmailField(max_length=255, null=False, verbose_name=_('email')) + #@TODO validate type format + curriculum_vitae = models.FileField(_("curriculum vitae"), max_length=1024, upload_to="job_responses/%Y/%m/%d/") + cover_letter = models.FileField(_("cover letter"), max_length=1024, upload_to="job_responses/%Y/%m/%d/") + job_offer = models.ForeignKey("JobOffer", verbose_name=_('job offer'), related_name='job_response', blank=True, null=True, on_delete=models.SET_NULL) + + class Meta: + verbose_name = _('job_reponse') + verbose_name_plural = _("job_reponses") + + +class JobOffer(Displayable, RichText): + + email = models.EmailField(max_length=255, null=False, verbose_name=_('Email to forward response')) + type = models.CharField(blank=True, choices=[('internship', 'internship'), ('job', 'job')], max_length=32, verbose_name='Job offer type') + + def get_absolute_url(self): + return reverse("organization-job-offer-detail", kwargs={"slug": self.slug}) + + class Meta: + verbose_name = _('job offer') + verbose_name_plural = _("job offers") + + diff --git a/app/organization/job/tests.py b/app/organization/job/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/app/organization/job/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/app/organization/job/translation.py b/app/organization/job/translation.py new file mode 100644 index 00000000..28a8fa9d --- /dev/null +++ b/app/organization/job/translation.py @@ -0,0 +1,10 @@ +from modeltranslation.translator import translator, register, TranslationOptions +from mezzanine.pages.models import Page, RichText +from mezzanine.pages.translation import TranslatedRichText +from organization.job.models import * + + +@register(JobOffer) +class JobOfferTranslationOptions(TranslationOptions): + + fields = ('title', 'content') diff --git a/app/organization/job/urls.py b/app/organization/job/urls.py new file mode 100644 index 00000000..e852861b --- /dev/null +++ b/app/organization/job/urls.py @@ -0,0 +1,18 @@ +from __future__ import unicode_literals + +from django.conf.urls import patterns, include, url +from django.conf.urls.i18n import i18n_patterns +from django.contrib import admin + +from mezzanine.core.views import direct_to_template +from mezzanine.conf import settings +from organization.job.views import JobOfferDetailView, JobOfferListView + + +_slash = "/" if settings.APPEND_SLASH else "" + +urlpatterns = [ + url("^job-offer/(?P.*)%s$" % _slash, JobOfferDetailView.as_view(), name='organization-job-offer-detail'), + url("^job-offer/$", JobOfferListView.as_view(), name='organization-job-offer-list'), + #url(r'job-response/add/$', JobResponseCreate.as_view(), name='job-response-add'), +] diff --git a/app/organization/job/views.py b/app/organization/job/views.py new file mode 100644 index 00000000..5d3f4c2d --- /dev/null +++ b/app/organization/job/views.py @@ -0,0 +1,57 @@ +import os +from django.shortcuts import render +from django.views.generic import DetailView, ListView, TemplateView +from django.views.generic.edit import CreateView +from django.contrib import messages +from django.core.urlresolvers import reverse, reverse_lazy +from django.utils.translation import ugettext_lazy as _ +from organization.job.models import JobOffer, JobResponse +from organization.job.forms import JobResponseForm + + +class JobOfferDetailView(CreateView): + + model = JobResponse + template_name='job/job_offer_detail.html' + context_object_name = 'job_offer' + form_class = JobResponseForm + + def get_context_data(self, **kwargs): + context = super(JobOfferDetailView, self).get_context_data(**kwargs) + job_offer = JobOffer.objects.get(slug=self.kwargs['slug']) + if job_offer : + context['job_offer'] = job_offer + return context + + def get_initial(self): + initial = super(JobOfferDetailView, self).get_initial() + job_offer = JobOffer.objects.get(slug=self.kwargs['slug']) + if job_offer : + initial['job_offer'] = job_offer + return initial + + def get_success_url(self): + return reverse_lazy('organization-job-offer-detail', kwargs={'slug':self.kwargs['slug']}) + + def form_valid(self, form): + # check extension uploaded files + # name_cv, ext_cv = os.path.splitext(self.cleaned_data['curriculum_vitae'].name) + # name_cl, ext_cl = os.path.splitext(self.cleaned_data['cover_letter'].name) + # if ext_cv not in ['.pdf', '.PDF', '.doc', '.docx']: + # raise forms.ValidationError("Only .pdf, .doc, .docx files allowed") + messages.info(self.request, _("You have successfully submitted your application.")) + return super(JobOfferDetailView, self).form_valid(form) + + +class JobOfferListView(ListView): + + model = JobOffer + template_name='job/job_offer_list.html' + context_object_name = 'job_offer' + + def get_queryset(self, **kwargs): + return self.model.objects.published() + + def get_context_data(self, **kwargs): + context = super(JobOfferListView, self).get_context_data(**kwargs) + return context diff --git a/app/organization/pages/admin.py b/app/organization/pages/admin.py index 10d3bab2..b53f5e5b 100644 --- a/app/organization/pages/admin.py +++ b/app/organization/pages/admin.py @@ -1,5 +1,3 @@ -from django.contrib import admin - from django.contrib import admin from mezzanine.utils.static import static_lazy as static from copy import deepcopy @@ -9,8 +7,7 @@ from organization.pages.models import * from organization.pages.models import ( DynamicContentHomeSlider, DynamicContentHomeBody, - Home, - JobOffer + Home ) from organization.pages.forms import DynamicContentHomeSliderForm, DynamicContentHomeBodyForm @@ -64,11 +61,6 @@ class HomeAdminDisplayable(BaseTranslationModelAdmin): inlines = [DynamicContentHomeSliderInline, DynamicContentHomeBodyInline ] -class JobOfferAdminDisplayable(BaseTranslationModelAdmin): - - model = JobOffer - admin.site.register(CustomPage, CustomPageAdmin) admin.site.register(Home, HomeAdminDisplayable) -admin.site.register(JobOffer, JobOfferAdminDisplayable) diff --git a/app/organization/pages/forms.py b/app/organization/pages/forms.py index 9d3782d6..77816724 100644 --- a/app/organization/pages/forms.py +++ b/app/organization/pages/forms.py @@ -9,7 +9,7 @@ from django.forms import ModelForm from mezzanine.core.models import Orderable from organization.magazine.models import Article, Topic, Brief from organization.pages.models import CustomPage -from organization.pages.models import DynamicContentHomeSlider, DynamicContentHomeBody, JobResponse +from organization.pages.models import DynamicContentHomeSlider, DynamicContentHomeBody class DynamicContentHomeSliderForm(autocomplete.FutureModelForm): @@ -43,14 +43,3 @@ class DynamicContentHomeBodyForm(autocomplete.FutureModelForm): class Meta: model = DynamicContentHomeBody fields = ('content_object',) - - -class JobResponseForm(ModelForm): - - def __init__(self, *args, **kwargs): - super(JobResponseForm, self).__init__(*args, **kwargs) - self.fields['job_offer'].widget = forms.HiddenInput() - - class Meta: - model = JobResponse - fields = ['first_name', 'last_name', 'email', 'curriculum_vitae', 'cover_letter', 'job_offer'] diff --git a/app/organization/pages/migrations/0003_auto_20160907_1151.py b/app/organization/pages/migrations/0003_auto_20160907_1151.py deleted file mode 100644 index 6f76a882..00000000 --- a/app/organization/pages/migrations/0003_auto_20160907_1151.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-09-07 09:51 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization-pages', '0002_joboffer_jobresponse'), - ] - - operations = [ - migrations.AddField( - model_name='joboffer', - name='title_en', - field=models.CharField(max_length=500, null=True, verbose_name='Title'), - ), - migrations.AddField( - model_name='joboffer', - name='title_fr', - field=models.CharField(max_length=500, null=True, verbose_name='Title'), - ), - ] diff --git a/app/organization/pages/migrations/0004_auto_20160907_1153.py b/app/organization/pages/migrations/0004_auto_20160907_1153.py deleted file mode 100644 index 3cfc79ad..00000000 --- a/app/organization/pages/migrations/0004_auto_20160907_1153.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-09-07 09:53 -from __future__ import unicode_literals - -from django.db import migrations -import mezzanine.core.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization-pages', '0003_auto_20160907_1151'), - ] - - operations = [ - migrations.AlterModelOptions( - name='joboffer', - options={'verbose_name': 'job offer', 'verbose_name_plural': 'job offers'}, - ), - migrations.AddField( - model_name='joboffer', - name='content', - field=mezzanine.core.fields.RichTextField(default='', verbose_name='Content'), - preserve_default=False, - ), - ] diff --git a/app/organization/pages/migrations/0005_auto_20160907_1529.py b/app/organization/pages/migrations/0005_auto_20160907_1529.py deleted file mode 100644 index 5a92143e..00000000 --- a/app/organization/pages/migrations/0005_auto_20160907_1529.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-09-07 13:29 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization-pages', '0004_auto_20160907_1153'), - ] - - operations = [ - migrations.AlterField( - model_name='jobresponse', - name='job_offer', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='job_response', to='organization-pages.JobOffer', verbose_name='job offer'), - ), - ] diff --git a/app/organization/pages/migrations/0006_auto_20160908_1032.py b/app/organization/pages/migrations/0006_auto_20160908_1032.py deleted file mode 100644 index 4d3a0aae..00000000 --- a/app/organization/pages/migrations/0006_auto_20160908_1032.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-09-08 08:32 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('sites', '0002_alter_domain_unique'), - ('organization-pages', '0005_auto_20160907_1529'), - ] - - operations = [ - migrations.AddField( - model_name='jobresponse', - name='site', - field=models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.Site'), - preserve_default=False, - ), - migrations.AddField( - model_name='jobresponse', - name='slug', - field=models.CharField(blank=True, help_text='Leave blank to have the URL auto-generated from the title.', max_length=2000, null=True, verbose_name='URL'), - ), - migrations.AddField( - model_name='jobresponse', - name='title', - field=models.CharField(default='job', max_length=500, verbose_name='Title'), - preserve_default=False, - ), - ] diff --git a/app/organization/pages/migrations/0007_auto_20160908_1518.py b/app/organization/pages/migrations/0007_auto_20160908_1518.py deleted file mode 100644 index 6a7eb503..00000000 --- a/app/organization/pages/migrations/0007_auto_20160908_1518.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-09-08 13:18 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization-pages', '0006_auto_20160908_1032'), - ] - - operations = [ - migrations.AlterField( - model_name='jobresponse', - name='cover_letter', - field=models.FileField(max_length=1024, upload_to='job_responses/%Y/%m/%d/', verbose_name='cover letter'), - ), - migrations.AlterField( - model_name='jobresponse', - name='curriculum_vitae', - field=models.FileField(max_length=1024, upload_to='job_responses/%Y/%m/%d/', verbose_name='curriculum vitae'), - ), - ] diff --git a/app/organization/pages/migrations/0008_auto_20160908_1602.py b/app/organization/pages/migrations/0008_auto_20160908_1602.py deleted file mode 100644 index b77b4633..00000000 --- a/app/organization/pages/migrations/0008_auto_20160908_1602.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-09-08 14:02 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('organization-pages', '0007_auto_20160908_1518'), - ] - - operations = [ - migrations.RemoveField( - model_name='jobresponse', - name='site', - ), - migrations.RemoveField( - model_name='jobresponse', - name='slug', - ), - migrations.RemoveField( - model_name='jobresponse', - name='title', - ), - ] diff --git a/app/organization/pages/models.py b/app/organization/pages/models.py index 9d1c6b68..dafca374 100644 --- a/app/organization/pages/models.py +++ b/app/organization/pages/models.py @@ -76,31 +76,3 @@ class Home(Displayable): def get_absolute_url(self): return reverse("organization-home") - - -class JobResponse(models.Model): - - first_name = models.CharField(max_length=255, null=False, verbose_name=_('first name')) - last_name = models.CharField(max_length=255, null=False, verbose_name=_('last name')) - email = models.EmailField(max_length=255, null=False, verbose_name=_('email')) - #@TODO validate type format - curriculum_vitae = models.FileField(_("curriculum vitae"), max_length=1024, upload_to="job_responses/%Y/%m/%d/") - cover_letter = models.FileField(_("cover letter"), max_length=1024, upload_to="job_responses/%Y/%m/%d/") - job_offer = models.ForeignKey("JobOffer", verbose_name=_('job offer'), related_name='job_response', blank=True, null=True, on_delete=models.SET_NULL) - - class Meta: - verbose_name = _('job_reponse') - verbose_name_plural = _("job_reponses") - - -class JobOffer(Displayable, RichText): - - email = models.EmailField(max_length=255, null=False, verbose_name=_('Email to forward response')) - type = models.CharField(blank=True, choices=[('internship', 'internship'), ('job', 'job')], max_length=32, verbose_name='Job offer type') - - def get_absolute_url(self): - return reverse("organization-job-offer-detail", kwargs={"slug": self.slug}) - - class Meta: - verbose_name = _('job offer') - verbose_name_plural = _("job offers") diff --git a/app/organization/pages/translation.py b/app/organization/pages/translation.py index fe3378dd..873e123a 100644 --- a/app/organization/pages/translation.py +++ b/app/organization/pages/translation.py @@ -50,8 +50,3 @@ class PageVideoTranslationOptions(TranslationOptions): class PageAudioTranslationOptions(TranslationOptions): pass - -@register(JobOffer) -class PageAudioTranslationOptions(TranslationOptions): - - fields = ('title',) diff --git a/app/organization/pages/urls.py b/app/organization/pages/urls.py index 0c626181..4edb52df 100644 --- a/app/organization/pages/urls.py +++ b/app/organization/pages/urls.py @@ -9,10 +9,7 @@ from mezzanine.conf import settings from organization.pages.views import ( DynamicContentHomeSliderView, DynamicContentHomeBodyView, - HomeView, - JobOfferDetailView, - JobOfferListView, - # JobResponseCreate + HomeView ) _slash = "/" if settings.APPEND_SLASH else "" @@ -22,7 +19,4 @@ urlpatterns = [ url("^dynamic-content-home-slider/$", DynamicContentHomeSliderView.as_view(), name='dynamic-content-home-slider'), url("^dynamic-content-home-body/$", DynamicContentHomeBodyView.as_view(), name='dynamic-content-home-body'), url("^home/$", HomeView.as_view(), name='organization-home'), - url("^job-offer/(?P.*)%s$" % _slash, JobOfferDetailView.as_view(), name='organization-job-offer-detail'), - url("^job-offer/$", JobOfferListView.as_view(), name='organization-job-offer-list'), - #url(r'job-response/add/$', JobResponseCreate.as_view(), name='job-response-add'), ] diff --git a/app/organization/pages/views.py b/app/organization/pages/views.py index e157b88a..387c51f5 100644 --- a/app/organization/pages/views.py +++ b/app/organization/pages/views.py @@ -1,7 +1,5 @@ from django.shortcuts import render from django.views.generic import DetailView, ListView, TemplateView -from django.views.generic.edit import CreateView -from django.contrib import messages from dal import autocomplete from dal_select2_queryset_sequence.views import Select2QuerySetSequenceView from django.core.urlresolvers import reverse, reverse_lazy @@ -10,8 +8,8 @@ from django.utils.translation import ugettext_lazy as _ from organization.pages.models import CustomPage from organization.core.views import SlugMixin from organization.magazine.models import Article, Topic, Brief -from organization.pages.models import Home, JobOffer, JobResponse -from organization.pages.forms import JobResponseForm +from organization.pages.models import Home + class HomeView(SlugMixin, ListView): @@ -32,64 +30,6 @@ class HomeView(SlugMixin, ListView): return context -class JobOfferDetailView(CreateView): - - model = JobResponse - template_name='pages/joboffer/job_offer_detail.html' - context_object_name = 'job_offer' - form_class = JobResponseForm - - def get_context_data(self, **kwargs): - context = super(JobOfferDetailView, self).get_context_data(**kwargs) - job_offer = JobOffer.objects.get(slug=self.kwargs['slug']) - if job_offer : - context['job_offer'] = job_offer - return context - - def get_initial(self): - initial = super(JobOfferDetailView, self).get_initial() - job_offer = JobOffer.objects.get(slug=self.kwargs['slug']) - if job_offer : - initial['job_offer'] = job_offer - return initial - - def get_success_url(self): - return reverse_lazy('organization-job-offer-detail', kwargs={'slug':self.kwargs['slug']}) - - def form_valid(self, form): - messages.info(self.request, _("You have successfully submitted your application.")) - return super(JobOfferDetailView, self).form_valid(form) - - -class JobOfferListView(ListView): - - model = JobOffer - template_name='pages/joboffer/job_offer_list.html' - context_object_name = 'job_offer' - - def get_queryset(self, **kwargs): - return self.model.objects.published() - - def get_context_data(self, **kwargs): - context = super(JobOfferListView, self).get_context_data(**kwargs) - return context - - -# class JobResponseCreate(CreateView): -# -# template_name = 'pages/joboffer/inc/job_response_form.html' -# model = JobResponse -# # form_class = JobResponseForm -# fields = ['first_name', 'last_name', 'email', 'curriculum_vitae', 'cover_letter'] -# # success_url = '/job-offer-success/' -# -# def form_valid(self, form): -# # This method is called when valid form data has been POSTed. -# # It should return an HttpResponse. -# # form.send_email() -# return super(JobResponseView, self).form_valid(form) - - class DynamicContentHomeSliderView(Select2QuerySetSequenceView): def get_queryset(self): @@ -114,6 +54,7 @@ class DynamicContentHomeSliderView(Select2QuerySetSequenceView): return qs + class DynamicContentHomeBodyView(Select2QuerySetSequenceView): def get_queryset(self): diff --git a/app/organization/urls.py b/app/organization/urls.py index beed0ac1..5ed30ea1 100644 --- a/app/organization/urls.py +++ b/app/organization/urls.py @@ -20,4 +20,5 @@ urlpatterns = [ url("^", include('organization.projects.urls')), url("^", include('organization.network.urls')), url("^", include('organization.agenda.urls')), + url("^", include('organization.job.urls')), ] diff --git a/app/scripts/app.sh b/app/scripts/app.sh index 78003b6f..6faf3f03 100644 --- a/app/scripts/app.sh +++ b/app/scripts/app.sh @@ -35,6 +35,8 @@ python $manage wait-for-db python $manage migrate --noinput # python $manage bower_install -- --allow-root python $manage create-admin-user +# @todo searching every fixtures file in each folder +python $manage loaddata $app/organization/job/fixtures/organization-job.json # app start if [ "$1" = "--runserver" ]; then diff --git a/app/settings.py b/app/settings.py index 212f20bf..22f53288 100644 --- a/app/settings.py +++ b/app/settings.py @@ -235,6 +235,7 @@ INSTALLED_APPS = [ "organization.projects", "organization.agenda", "organization.products", + "organization.job", ] diff --git a/app/templates/pages/joboffer/inc/job_offer_card.html b/app/templates/job/inc/job_offer_card.html similarity index 100% rename from app/templates/pages/joboffer/inc/job_offer_card.html rename to app/templates/job/inc/job_offer_card.html diff --git a/app/templates/pages/joboffer/inc/job_response_form.html b/app/templates/job/inc/job_response_form.html similarity index 100% rename from app/templates/pages/joboffer/inc/job_response_form.html rename to app/templates/job/inc/job_response_form.html diff --git a/app/templates/pages/joboffer/job_offer_detail.html b/app/templates/job/job_offer_detail.html similarity index 88% rename from app/templates/pages/joboffer/job_offer_detail.html rename to app/templates/job/job_offer_detail.html index 660b1009..15754f0d 100644 --- a/app/templates/pages/joboffer/job_offer_detail.html +++ b/app/templates/job/job_offer_detail.html @@ -17,6 +17,6 @@

{% trans "Category" %} : {{ job_offer.type }}

{{ job_offer.content|richtext_filters|safe }}

{% with form as job_offer.job_response %} - {% include "pages/joboffer/inc/job_response_form.html" %} + {% include "job/inc/job_response_form.html" %} {% endwith %} {% endblock %} diff --git a/app/templates/pages/joboffer/job_offer_list.html b/app/templates/job/job_offer_list.html similarity index 91% rename from app/templates/pages/joboffer/job_offer_list.html rename to app/templates/job/job_offer_list.html index b611cc3a..f017ac1d 100644 --- a/app/templates/pages/joboffer/job_offer_list.html +++ b/app/templates/job/job_offer_list.html @@ -18,7 +18,7 @@ {% block page_content %} {% if job_offer %} {% for jo in job_offer %} - {% include "pages/joboffer/inc/job_offer_card.html" %} + {% include "job/inc/job_offer_card.html" %} {% endfor %} {% else %}

{% trans "Please come back later. There is no job offer at the moment." %}

-- 2.39.5