SILENCED_SYSTEM_CHECKS = ['fields.W342',]
ADMIN_MENU_ORDER = (
- (_('Pages'), ('pages.Page', 'organization-pages.Home')),
+ (_('Pages'), ('pages.Page', 'organization-pages.Home', 'organization-pages.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',)),
(_('Magazine'), ('organization-magazine.Article', 'organization-magazine.Brief',)),
from mezzanine.core.admin import *
from mezzanine.pages.admin import PageAdmin
from organization.pages.models import *
-from organization.pages.models import DynamicContentHomeSlider, DynamicContentHomeBody, Home
+from organization.pages.models import (
+ DynamicContentHomeSlider,
+ DynamicContentHomeBody,
+ Home,
+ JobOffer
+)
from organization.pages.forms import DynamicContentHomeSliderForm, DynamicContentHomeBodyForm
inlines = [DynamicContentHomeSliderInline, DynamicContentHomeBodyInline ]
+class JobOfferAdminDisplayable(BaseTranslationModelAdmin):
+
+ model = JobOffer
admin.site.register(CustomPage, CustomPageAdmin)
admin.site.register(Home, HomeAdminDisplayable)
+admin.site.register(JobOffer, JobOfferAdminDisplayable)
--- /dev/null
+# -*- 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',
+ },
+ ),
+ ]
--- /dev/null
+# -*- 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'),
+ ),
+ ]
--- /dev/null
+# -*- 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,
+ ),
+ ]
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 = FileField(_("curriculum_vitae"), max_length=1024, upload_to="job_responses/%Y/%m/%d/")
+ cover_letter = FileField(_("curriculum_vitae"), max_length=1024, upload_to="job_responses/%Y/%m/%d/")
+ job_offer = models.ForeignKey("JobOffer", verbose_name=_('job offer'), 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')
+
+ class Meta:
+ verbose_name = _('job offer')
+ verbose_name_plural = _("job offers")
+
+ def get_absolute_url(self):
+ return reverse("organization-job-offer-detail")
pass
+
@register(PageAudio)
class PageAudioTranslationOptions(TranslationOptions):
pass
+
+@register(JobOffer)
+class PageAudioTranslationOptions(TranslationOptions):
+
+ fields = ('title',)
from mezzanine.core.views import direct_to_template
from mezzanine.conf import settings
-from organization.pages.views import DynamicContentHomeSliderView, DynamicContentHomeBodyView, HomeView
+from organization.pages.views import (
+ DynamicContentHomeSliderView,
+ DynamicContentHomeBodyView,
+ HomeView,
+ JobOfferDetailView
+)
_slash = "/" if settings.APPEND_SLASH else ""
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$", JobOfferDetailView.as_view(), name='organization-job-offer-detail'),
]
-'dynamic-content-home-body'
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
+from organization.pages.models import Home, JobOffer
class HomeView(SlugMixin, ListView):
return context
+class JobOfferDetailView(SlugMixin, DetailView):
+
+ model = JobOffer
+ template_name='pages/job_offer_detail.html'
+ context_object_name = 'job_offer'
+
+ def get_context_data(self, **kwargs):
+ context = super(JobOfferDetailView, self).get_context_data(**kwargs)
+ return context
+
class DynamicContentHomeSliderView(Select2QuerySetSequenceView):
def get_queryset(self):
--- /dev/null
+# -*- 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
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-projects', '0004_auto_20160905_1853'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='project',
+ name='type',
+ field=models.CharField(choices=[('internal project', 'internal project'), ('external project', 'external project')], max_length=128, verbose_name='type'),
+ ),
+ ]