]> git.parisson.com Git - mezzo.git/commitdiff
JobOffer : creating app JOB and adding fixture loading in app.sh
authorEmilie <zawadzki@ircam.fr>
Fri, 9 Sep 2016 08:26:29 +0000 (10:26 +0200)
committerEmilie <zawadzki@ircam.fr>
Fri, 9 Sep 2016 08:26:29 +0000 (10:26 +0200)
37 files changed:
app/local_settings.py
app/organization/job/__init__.py [new file with mode: 0644]
app/organization/job/admin.py [new file with mode: 0644]
app/organization/job/apps.py [new file with mode: 0644]
app/organization/job/fixtures/organization-job.json [new file with mode: 0644]
app/organization/job/forms.py [new file with mode: 0644]
app/organization/job/migrations/0001_initial.py [new file with mode: 0644]
app/organization/job/migrations/__init__.py [new file with mode: 0644]
app/organization/job/models.py [new file with mode: 0644]
app/organization/job/tests.py [new file with mode: 0644]
app/organization/job/translation.py [new file with mode: 0644]
app/organization/job/urls.py [new file with mode: 0644]
app/organization/job/views.py [new file with mode: 0644]
app/organization/pages/admin.py
app/organization/pages/forms.py
app/organization/pages/migrations/0002_joboffer_jobresponse.py [deleted file]
app/organization/pages/migrations/0003_auto_20160907_1151.py [deleted file]
app/organization/pages/migrations/0004_auto_20160907_1153.py [deleted file]
app/organization/pages/migrations/0005_auto_20160907_1529.py [deleted file]
app/organization/pages/migrations/0006_auto_20160908_1032.py [deleted file]
app/organization/pages/migrations/0007_auto_20160908_1518.py [deleted file]
app/organization/pages/migrations/0008_auto_20160908_1602.py [deleted file]
app/organization/pages/models.py
app/organization/pages/translation.py
app/organization/pages/urls.py
app/organization/pages/views.py
app/organization/urls.py
app/scripts/app.sh
app/settings.py
app/templates/job/inc/job_offer_card.html [new file with mode: 0644]
app/templates/job/inc/job_response_form.html [new file with mode: 0644]
app/templates/job/job_offer_detail.html [new file with mode: 0644]
app/templates/job/job_offer_list.html [new file with mode: 0644]
app/templates/pages/joboffer/inc/job_offer_card.html [deleted file]
app/templates/pages/joboffer/inc/job_response_form.html [deleted file]
app/templates/pages/joboffer/job_offer_detail.html [deleted file]
app/templates/pages/joboffer/job_offer_list.html [deleted file]

index c1f9e86abd2f5d68f2fa52fee2c87018c38e2d9d..6883ac3c356cae8ae22696e57ec5b0bbc52e71e9 100644 (file)
@@ -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 (file)
index 0000000..97d1ce6
--- /dev/null
@@ -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 (file)
index 0000000..cbeef7b
--- /dev/null
@@ -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 (file)
index 0000000..d340490
--- /dev/null
@@ -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 (file)
index 0000000..a17da88
--- /dev/null
@@ -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": "<p>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.</p>", "content_fr": "<p>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.</p>", "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 (file)
index 0000000..c37e8ba
--- /dev/null
@@ -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/job/migrations/0001_initial.py b/app/organization/job/migrations/0001_initial.py
new file mode 100644 (file)
index 0000000..c8b648b
--- /dev/null
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-09-09 07:50
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import mezzanine.core.fields
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ('sites', '0002_alter_domain_unique'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='JobOffer',
+            fields=[
+                ('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')),
+                ('gen_description', models.BooleanField(default=True, help_text='If checked, the description will be automatically generated from content. Uncheck if you want to manually set a custom description.', verbose_name='Generate description')),
+                ('created', models.DateTimeField(editable=False, null=True)),
+                ('updated', models.DateTimeField(editable=False, null=True)),
+                ('status', models.IntegerField(choices=[(1, 'Draft'), (2, 'Published')], default=2, help_text='With Draft chosen, will only be shown for admin users on the site.', verbose_name='Status')),
+                ('publish_date', models.DateTimeField(blank=True, db_index=True, help_text="With Published chosen, won't be shown until this time", null=True, verbose_name='Published from')),
+                ('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 offers',
+            },
+        ),
+        migrations.CreateModel(
+            name='JobResponse',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('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', 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',
+                'verbose_name_plural': 'job_reponses',
+            },
+        ),
+    ]
diff --git a/app/organization/job/migrations/__init__.py b/app/organization/job/migrations/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/app/organization/job/models.py b/app/organization/job/models.py
new file mode 100644 (file)
index 0000000..8f608fd
--- /dev/null
@@ -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 (file)
index 0000000..7ce503c
--- /dev/null
@@ -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 (file)
index 0000000..28a8fa9
--- /dev/null
@@ -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 (file)
index 0000000..e852861
--- /dev/null
@@ -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<slug>.*)%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 (file)
index 0000000..5d3f4c2
--- /dev/null
@@ -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
index 10d3bab27c0165a8b44e60feef374e4e16a7394a..b53f5e5b45b1a1b43fc4127982a5e445b89827b0 100644 (file)
@@ -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)
index 9d3782d66cb110bc405c187ecdfaacb8419af81f..778167243d63517b297bef3f01ea886451e398b1 100644 (file)
@@ -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/0002_joboffer_jobresponse.py b/app/organization/pages/migrations/0002_joboffer_jobresponse.py
deleted file mode 100644 (file)
index a82cecf..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-09-07 09:38
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-import django.db.models.deletion
-import mezzanine.core.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('sites', '0002_alter_domain_unique'),
-        ('organization-pages', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='JobOffer',
-            fields=[
-                ('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')),
-                ('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')),
-                ('gen_description', models.BooleanField(default=True, help_text='If checked, the description will be automatically generated from content. Uncheck if you want to manually set a custom description.', verbose_name='Generate description')),
-                ('created', models.DateTimeField(editable=False, null=True)),
-                ('updated', models.DateTimeField(editable=False, null=True)),
-                ('status', models.IntegerField(choices=[(1, 'Draft'), (2, 'Published')], default=2, help_text='With Draft chosen, will only be shown for admin users on the site.', verbose_name='Status')),
-                ('publish_date', models.DateTimeField(blank=True, db_index=True, help_text="With Published chosen, won't be shown until this time", null=True, verbose_name='Published from')),
-                ('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')),
-                ('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',
-            },
-        ),
-        migrations.CreateModel(
-            name='JobResponse',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('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')),
-            ],
-            options={
-                'verbose_name': 'job_reponse',
-                'verbose_name_plural': 'job_reponses',
-            },
-        ),
-    ]
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 (file)
index 6f76a88..0000000
+++ /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 (file)
index 3cfc79a..0000000
+++ /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 (file)
index 5a92143..0000000
+++ /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 (file)
index 4d3a0aa..0000000
+++ /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 (file)
index 6a7eb50..0000000
+++ /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 (file)
index b77b463..0000000
+++ /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',
-        ),
-    ]
index 9d1c6b68f2dbfb3688cc2ed8e28d0d8bab7a2839..dafca37408b2d4edc4edcb852494560d96638ed2 100644 (file)
@@ -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")
index fe3378ddaab47e37ea6096781d5bdf6fca4e7023..873e123a6698dcbd00267fc15fc9eba43c0ce54c 100644 (file)
@@ -50,8 +50,3 @@ class PageVideoTranslationOptions(TranslationOptions):
 class PageAudioTranslationOptions(TranslationOptions):
 
     pass
-
-@register(JobOffer)
-class PageAudioTranslationOptions(TranslationOptions):
-
-    fields = ('title',)
index 0c626181246aca36c124ee3d4f7966d12d7fdf69..4edb52df7567f96ea25a5482385f137adabc41d5 100644 (file)
@@ -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<slug>.*)%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'),
 ]
index e157b88a9f1a7a02bf63e5964af27b63f4d49dc4..387c51f5751705da28a25ecb2aee98e3ebd246f7 100644 (file)
@@ -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):
 
index beed0ac18254f79e20ad1ba451db031669f039be..5ed30ea180ca33c3aec94da2b546ca542c0919c5 100644 (file)
@@ -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')),
 ]
index 78003b6f222cc4cab4d3cbc2bc195b60faa8f4fd..6faf3f03851b1d3b6a4333114d975de7f1c24cba 100644 (file)
@@ -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
index 212f20bf287437b6446b4f5c43e2ce3c2744f700..22f532884f78070672d4caa47b805385b8341631 100644 (file)
@@ -235,6 +235,7 @@ INSTALLED_APPS = [
     "organization.projects",
     "organization.agenda",
     "organization.products",
+    "organization.job",
 ]
 
 
diff --git a/app/templates/job/inc/job_offer_card.html b/app/templates/job/inc/job_offer_card.html
new file mode 100644 (file)
index 0000000..1133395
--- /dev/null
@@ -0,0 +1,4 @@
+<a href="{{ jo.get_absolute_url }}" title="{{ jo.title }}">
+  <h2>{{ jo.title }}</h2>
+  <p>{{ jo.description|slice:":255" }}</p>
+</a>
diff --git a/app/templates/job/inc/job_response_form.html b/app/templates/job/inc/job_response_form.html
new file mode 100644 (file)
index 0000000..691c7fc
--- /dev/null
@@ -0,0 +1,4 @@
+<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
+    {{ form.as_p }}
+    <input type="submit" value="Send message" />
+</form>
diff --git a/app/templates/job/job_offer_detail.html b/app/templates/job/job_offer_detail.html
new file mode 100644 (file)
index 0000000..15754f0
--- /dev/null
@@ -0,0 +1,22 @@
+{% extends "pages/page.html" %}
+{% load mezzanine_tags keyword_tags i18n organization_tags %}
+
+
+{% block page_title %}
+
+    {% editable project.title %}
+        <h1 class="dotted">{{ job_offer.title }}</h1>
+    {% endeditable %}
+
+{% endblock %}
+
+{% block page_content %}
+
+  {% include "core/inc/messages.html" %}
+
+  <p>{% trans "Category" %} : {{ job_offer.type }}</p>
+  <p>{{ job_offer.content|richtext_filters|safe }}</p>
+  {% with form as job_offer.job_response %}
+    {% include "job/inc/job_response_form.html" %}
+  {% endwith %}
+{% endblock %}
diff --git a/app/templates/job/job_offer_list.html b/app/templates/job/job_offer_list.html
new file mode 100644 (file)
index 0000000..f017ac1
--- /dev/null
@@ -0,0 +1,27 @@
+{% extends "pages/page.html" %}
+{% load i18n mezzanine_tags keyword_tags pages_tags organization_tags %}
+
+{% block meta_title %}{{ job_offer.meta_title }}{% endblock %}
+
+{% block meta_description %}{% metablock %}
+{{ job_offer.description }}
+{% endmetablock %}{% endblock %}
+
+{% block page_class %}
+    job_offer
+{% endblock %}
+
+{% block page_title %}
+  <h1 class="dashed">{% trans "Jobs" %}</h1>
+{% endblock %}
+
+{% block page_content %}
+    {% if job_offer %}
+      {% for jo in job_offer %}
+        {% include "job/inc/job_offer_card.html" %}
+      {% endfor %}
+    {% else %}
+      <p>{% trans "Please come back later. There is no job offer at the moment." %}</p>
+    {% endif %}
+
+{% endblock %}
diff --git a/app/templates/pages/joboffer/inc/job_offer_card.html b/app/templates/pages/joboffer/inc/job_offer_card.html
deleted file mode 100644 (file)
index 1133395..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<a href="{{ jo.get_absolute_url }}" title="{{ jo.title }}">
-  <h2>{{ jo.title }}</h2>
-  <p>{{ jo.description|slice:":255" }}</p>
-</a>
diff --git a/app/templates/pages/joboffer/inc/job_response_form.html b/app/templates/pages/joboffer/inc/job_response_form.html
deleted file mode 100644 (file)
index 691c7fc..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
-    {{ form.as_p }}
-    <input type="submit" value="Send message" />
-</form>
diff --git a/app/templates/pages/joboffer/job_offer_detail.html b/app/templates/pages/joboffer/job_offer_detail.html
deleted file mode 100644 (file)
index 660b100..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{% extends "pages/page.html" %}
-{% load mezzanine_tags keyword_tags i18n organization_tags %}
-
-
-{% block page_title %}
-
-    {% editable project.title %}
-        <h1 class="dotted">{{ job_offer.title }}</h1>
-    {% endeditable %}
-
-{% endblock %}
-
-{% block page_content %}
-
-  {% include "core/inc/messages.html" %}
-
-  <p>{% trans "Category" %} : {{ job_offer.type }}</p>
-  <p>{{ job_offer.content|richtext_filters|safe }}</p>
-  {% with form as job_offer.job_response %}
-    {% include "pages/joboffer/inc/job_response_form.html" %}
-  {% endwith %}
-{% endblock %}
diff --git a/app/templates/pages/joboffer/job_offer_list.html b/app/templates/pages/joboffer/job_offer_list.html
deleted file mode 100644 (file)
index b611cc3..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{% extends "pages/page.html" %}
-{% load i18n mezzanine_tags keyword_tags pages_tags organization_tags %}
-
-{% block meta_title %}{{ job_offer.meta_title }}{% endblock %}
-
-{% block meta_description %}{% metablock %}
-{{ job_offer.description }}
-{% endmetablock %}{% endblock %}
-
-{% block page_class %}
-    job_offer
-{% endblock %}
-
-{% block page_title %}
-  <h1 class="dashed">{% trans "Jobs" %}</h1>
-{% endblock %}
-
-{% block page_content %}
-    {% if job_offer %}
-      {% for jo in job_offer %}
-        {% include "pages/joboffer/inc/job_offer_card.html" %}
-      {% endfor %}
-    {% else %}
-      <p>{% trans "Please come back later. There is no job offer at the moment." %}</p>
-    {% endif %}
-
-{% endblock %}