From 738af7211f68a4bd7dda37ba319bc5c4b7fc533b Mon Sep 17 00:00:00 2001 From: Luuk Scholten Date: Fri, 5 Aug 2016 21:19:52 +0200 Subject: [PATCH 1/9] Rename sponsors to partners --- .../locale/nl/LC_MESSAGES/django.mo | Bin 10051 -> 10052 bytes .../locale/nl/LC_MESSAGES/django.po | 8 ++-- website/thaliawebsite/menus.py | 2 +- website/thaliawebsite/static/css/style.less | 38 +++++++++--------- website/thaliawebsite/templates/base.html | 16 ++++---- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/website/thaliawebsite/locale/nl/LC_MESSAGES/django.mo b/website/thaliawebsite/locale/nl/LC_MESSAGES/django.mo index cee423810cf98e2b3b6002058cf06e684f2a12e5..bf331626e698443ef968991819d87e31a79d85ee 100644 GIT binary patch delta 847 zcmX}qKWGzi6u|L!a@W|Jwlvx_n%bs+G)?NImq?qKO6!mlL`g*j5kzswkR_3{6go%{ z>ZFSv)>%+c5EO23bE$~vq@Z+A&`CFO5sNhS`@G=6FQ5Ege)rz{{eD?5zbrpHWw<*< zWFssxZ-{)w4(200BK9JASi0Uqh|*0H^Q??!r%~9e&47{DGQpGbYV{FPK!(mczIo2T>Ok z@i>jR?fI>JL4tcY!teJ{3$CLUc#B8yJ?i`6c;En<%tw(uN)lIbF5aZb4iXU16KGLg z&o(j?7)L$Baij-Hqwb)D7ig@ETKLg$koYNT;a8~fcc=|+AWP*7MsORsHitZ&}9R$Q4uyRm$+f}A}gpHx{G`8G3r&kz(IV2 znm_f8FM5|h(Zp@sB(ZrwZ*__^V)^&AdO z7i?!bk;@jd`AH||I9;a~>@$_+>SDECvrAW&D#b+3$IZ0wpr9*QfRHEo04hjwhvovZ|G6-4f zqAumsO%PNNT!b6N#ebmS;7}06NvNARh*%-T@AHBOzkKrh-S6Iezu$Y^c-44z%lGt&9@K_6MP^f+$EEb4|D z9-)wWZ+>eu3~&#}dH(=4;Y-v6@3Dp-QNNF8L(^z7A4kq8lemP3vmFt40|8jj8|ac< z?neL%L#3U0!ms5cPHi_ktvcKE|B zOAeD*L2c$y)Q#s*3%YJf9Jfx+Uu!NlTMJhG{FQk(@7Se^WrzD5*C`e4lE0q%Wmcw3 TcCeP7iv^9`oBu(F^X1rI03K(x diff --git a/website/thaliawebsite/locale/nl/LC_MESSAGES/django.po b/website/thaliawebsite/locale/nl/LC_MESSAGES/django.po index e4847d0a..df30a40d 100644 --- a/website/thaliawebsite/locale/nl/LC_MESSAGES/django.po +++ b/website/thaliawebsite/locale/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-07-27 23:29+0200\n" -"PO-Revision-Date: 2016-07-27 22:21+0100\n" +"POT-Creation-Date: 2016-08-05 21:17+0200\n" +"PO-Revision-Date: 2016-08-05 21:18+0200\n" "Last-Translator: Joost Rijneveld \n" "Language-Team: \n" "Language: nl\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.6.10\n" +"X-Generator: Poedit 1.8.7.1\n" #: admin.py:5 msgid "Thalia administration" @@ -93,7 +93,7 @@ msgid "Career" msgstr "Carrière" #: menus.py:23 -msgid "Sponsors" +msgid "Partners" msgstr "Sponsoren" #: menus.py:24 diff --git a/website/thaliawebsite/menus.py b/website/thaliawebsite/menus.py index 3fb22d46..9b762675 100644 --- a/website/thaliawebsite/menus.py +++ b/website/thaliawebsite/menus.py @@ -22,7 +22,7 @@ main = [ ]}, {'title': _('Calendar'), 'name': '#'}, {'title': _('Career'), 'name': '#', 'submenu': [ - {'title': _('Sponsors'), 'name': '#'}, + {'title': _('Partners'), 'name': '#'}, {'title': _('Vacancies'), 'name': '#'}, ]}, {'title': _('Education'), 'name': '#', 'submenu': [ diff --git a/website/thaliawebsite/static/css/style.less b/website/thaliawebsite/static/css/style.less index 1aac2fcb..ee3d3533 100644 --- a/website/thaliawebsite/static/css/style.less +++ b/website/thaliawebsite/static/css/style.less @@ -470,8 +470,8 @@ position: absolute; } - /* sponsor logos in header */ - .sponsor-header { + /* partner logos in header */ + .partner-header { position: absolute; height:70px; width:180px; @@ -479,13 +479,13 @@ text-align: center; padding:75px 0; - &#sponsor-left { + &#partner-left { left: 50%; text-align: right; margin-left: -470px; } - &#sponsor-right { + &#partner-right { right: 50%; text-align: right; margin-right: -470px; @@ -3729,7 +3729,7 @@ @media (max-width:979px) { - #logo-header .sponsor-header { + #logo-header .partner-header { display: none; } @@ -4062,13 +4062,13 @@ padding: 0; } - /* TODO: clean sponsorstuff in the future */ + /* TODO: clean partnerstuff in the future */ - #sponsor_vacatures { + #partner_vacatures { margin-top: 20px; } - #sponsortitel_rechts img{ + #partnertitel_rechts img{ width:30px; height:30px; float:left; @@ -4076,7 +4076,7 @@ border-radius:5px; } - .sponsor_image_item{ + .partner_image_item{ width:100%; height:162px; background-color:#FFFFFF; @@ -4085,11 +4085,11 @@ text-align:center; } - .possibly_main_sponsor { + .possibly_main_partner { position: relative; } - #sponsor_images img{ + #partner_images img{ max-height:162px; max-width:288px; display: block; @@ -4098,14 +4098,14 @@ text-align:center; } - #sponsortitel_links h2{ + #partnertitel_links h2{ float:left; width:100%; color:#E62272; font-size:28px; } - .sponsor_informatie_omschrijving{ + .partner_informatie_omschrijving{ width:100px; float:left; font-weight:bold; @@ -4142,23 +4142,23 @@ #careerpage { - .th_hoofdsponsor_wrapper { + .th_hoofdpartner_wrapper { float: left; width: 100%; margin-bottom: 50px; } - .th_hoofdsponsor_logo { + .th_hoofdpartner_logo { float: left; width: 270px; min-height: 150px; } - .th_hoofdsponsor_logo img { + .th_hoofdpartner_logo img { width: 270px; } - .th_sponsor_logo { + .th_partner_logo { position: relative; overflow: hidden; float: left; @@ -4167,7 +4167,7 @@ text-align: center; } - .th_sponsor_logo img { + .th_partner_logo img { max-height: 270px; max-width: 90% !important; margin: auto; @@ -4198,7 +4198,7 @@ border: 3px solid black; } - .sponsor-logo-overlay-readmore { + .partner-logo-overlay-readmore { font-size: 14px; color: #FFFFFF; } diff --git a/website/thaliawebsite/templates/base.html b/website/thaliawebsite/templates/base.html index 0a174dd9..893cb255 100644 --- a/website/thaliawebsite/templates/base.html +++ b/website/thaliawebsite/templates/base.html @@ -57,17 +57,17 @@ - - {% endif %} @@ -54,7 +58,7 @@
- +

{{ partner.name }}

{{ partner.company_profile|truncatechars:180 }}

diff --git a/website/partners/templates/partners/partner.html b/website/partners/templates/partners/partner.html new file mode 100644 index 00000000..eac85d71 --- /dev/null +++ b/website/partners/templates/partners/partner.html @@ -0,0 +1,106 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block body %} + +

{{ partner.name }}

+ +

{% blocktrans with name=partner.name %}About {{ name }}{% endblocktrans %}

+ +
+ +
+
+

{% trans "Information" %}

+ {% trans "Street" %}: + {{ partner.address }}
+ {% trans "Zip Code" %}: + {{ partner.zip_code }}
+ {% trans "City" %}: + {{ partner.city }}

+ + {% if partner.link %} +
+ {% trans "Website" %}: + {{ partner.link }} +
+ {% endif %} +
+
+ +
+
+ + {# todo vacancies #} + {% if partner.vacancies.all|length > 0 %} +
+

Vacatures

+ +
+
+
    + getVacancies() as $vacancy): ?> +
  • + +
    + description ?> + + link !== ''): ?> + link)): ?> + link; ?> + + link); ?> + +

    + + + + +
    +
  • + +
+
+
+
+ + + {% endif %} + {# todo vacancies #} +{% endblock body %} diff --git a/website/partners/urls.py b/website/partners/urls.py index 27d1d59f..49cd9a6a 100644 --- a/website/partners/urls.py +++ b/website/partners/urls.py @@ -4,5 +4,6 @@ from . import views app_name = "partners" urlpatterns = [ - url('^', views.index, name='index'), + url(r'^$', views.index, name='index'), + url(r'^partners/(?P[-\w]+)$', views.partner, name='partner'), ] diff --git a/website/partners/views.py b/website/partners/views.py index ed171aa3..50104222 100644 --- a/website/partners/views.py +++ b/website/partners/views.py @@ -1,4 +1,4 @@ -from django.shortcuts import render +from django.shortcuts import get_object_or_404, render from partners.models import Partner from random import random @@ -15,3 +15,12 @@ def index(request): 'partners': sorted(partners, key=lambda x: random()), } return render(request, 'partners/index.html', context) + + +def partner(request, slug): + partner = get_object_or_404(Partner, slug=slug) + return render( + request, + 'partners/partner.html', + {'partner': partner} + ) -- GitLab From a0d22bdcad662b9604b4f9f186c02f6cae4eb35a Mon Sep 17 00:00:00 2001 From: Luuk Scholten Date: Wed, 10 Aug 2016 19:46:46 +0200 Subject: [PATCH 4/9] Add model and admin for vacancy categories --- website/partners/admin.py | 14 +++++++++- .../migrations/0002_vacancycategory.py | 27 +++++++++++++++++++ website/partners/models.py | 13 +++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 website/partners/migrations/0002_vacancycategory.py diff --git a/website/partners/admin.py b/website/partners/admin.py index c211da85..1a0cc6b5 100644 --- a/website/partners/admin.py +++ b/website/partners/admin.py @@ -1,6 +1,12 @@ from django.contrib import admin -from partners.models import Partner, PartnerImage +from utils.translation import TranslatedModelAdmin + +from partners.models import ( + Partner, + PartnerImage, + VacancyCategory, +) class PartnerImageInline(admin.StackedInline): @@ -25,3 +31,9 @@ class PartnerAdmin(admin.ModelAdmin): ) inlines = (PartnerImageInline,) + + +@admin.register(VacancyCategory) +class VacancyCategoryAdmin(TranslatedModelAdmin): + prepopulated_fields = {"slug": ("name_en",)} + fields = ['name', 'slug'] diff --git a/website/partners/migrations/0002_vacancycategory.py b/website/partners/migrations/0002_vacancycategory.py new file mode 100644 index 00000000..f006ce8a --- /dev/null +++ b/website/partners/migrations/0002_vacancycategory.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-10 17:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('partners', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='VacancyCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('slug', models.SlugField()), + ('name_en', models.CharField(max_length=30, verbose_name='name (EN)')), + ('name_nl', models.CharField(max_length=30, verbose_name='name (NL)')), + ], + options={ + 'verbose_name_plural': 'Vanancy Categories', + }, + ), + ] diff --git a/website/partners/models.py b/website/partners/models.py index dc24542a..3e8216cb 100644 --- a/website/partners/models.py +++ b/website/partners/models.py @@ -1,6 +1,8 @@ from django.db import models from django.core.validators import RegexValidator, URLValidator +from utils.translation import MultilingualField, ModelTranslateMeta + class Partner(models.Model): is_active = models.BooleanField(default=False) @@ -64,3 +66,14 @@ class PartnerImage(models.Model): def __str__(self): return 'image of {}'.format(self.partner.name) + + +class VacancyCategory(models.Model, metaclass=ModelTranslateMeta): + name = MultilingualField(models.CharField, max_length=30) + slug = models.SlugField() + + def __str__(self): + return self.name + + class Meta: + verbose_name_plural = 'Vanancy Categories' -- GitLab From 6cfa2491d03d9047fdd2523ba7d4364d8ac57bc9 Mon Sep 17 00:00:00 2001 From: Luuk Scholten Date: Sat, 13 Aug 2016 11:57:32 +0200 Subject: [PATCH 5/9] Add implementation of vacancies Vacancies can be added for both existing partners and other companies. --- website/partners/admin.py | 19 +++ .../partners/locale/nl/LC_MESSAGES/django.mo | Bin 2499 -> 3717 bytes .../partners/locale/nl/LC_MESSAGES/django.po | 38 ++++- website/partners/migrations/0003_vacancy.py | 33 +++++ website/partners/models.py | 44 ++++++ .../partners/templates/partners/partner.html | 63 ++++---- .../templates/partners/vacancies.html | 140 ++++++++++++++++++ website/partners/urls.py | 1 + website/partners/views.py | 21 ++- website/thaliawebsite/menus.py | 2 +- 10 files changed, 317 insertions(+), 44 deletions(-) create mode 100644 website/partners/migrations/0003_vacancy.py create mode 100644 website/partners/templates/partners/vacancies.html diff --git a/website/partners/admin.py b/website/partners/admin.py index 1a0cc6b5..7dcce565 100644 --- a/website/partners/admin.py +++ b/website/partners/admin.py @@ -6,6 +6,7 @@ from partners.models import ( Partner, PartnerImage, VacancyCategory, + Vacancy, ) @@ -37,3 +38,21 @@ class PartnerAdmin(admin.ModelAdmin): class VacancyCategoryAdmin(TranslatedModelAdmin): prepopulated_fields = {"slug": ("name_en",)} fields = ['name', 'slug'] + + +@admin.register(Vacancy) +class VacancyAdmin(admin.ModelAdmin): + fieldsets = ( + (None, { + 'fields': ('title', 'description', 'link') + }), + ('Existing Partner', { + 'fields': ('partner',) + }), + ('Other Partner', { + 'fields': ('company_name', 'company_logo',) + }), + ('Categories', { + 'fields': ('categories', ) + }), + ) diff --git a/website/partners/locale/nl/LC_MESSAGES/django.mo b/website/partners/locale/nl/LC_MESSAGES/django.mo index a779778b7fdd8e9cd7dd2830c7cb99ca53ce6c81..f6d14410a2c19bc2be4019940b66f5daebce072f 100644 GIT binary patch literal 3717 zcmeHK-EQ1O6gE&OEPqlF;sPWNl|YGzx4WqX(YC25NeV>`S<2EPZmRM6?Cz}X8Ea;| z+eBRR1aQX_@CG~yH;7vvfEVC9<4w9jg)1&&#rxUgGw1g^KF%LkF8!3?cpc|EIDf?X z7S30m!4HlZ@HLkK>Q`U_<0d{06c{5FM(q3XDo{SUw~rwSD@JIKIaym!*_iRHS=%pIxT&WlxLdZ&spc)-$ zW5!{X*sN6fT8x`*kTlUI*1$=|&q6(y#u%IUrY19G3NH1$h@zrA;~Wu9d?|(K(nE;( zpj4n7X_H{25UMPhLJXX2Ejg7^7|jjB@F0X)vMb<$uk1AHpK(mmp&icxH8i$n>=^ab zD70hmnP!}2&;%mH;$*Htna!%a=Xi7)BA1a7ka0e6V`TRP0T{6W5O;DilE;7dX)6X+ zG;tF{1*etL;Ib%fgl16z{21G+(%vhlQMku&+c2yI$Av^Hg%$cCrVJ730y`nN(28y< znmL~AUKPc`4%VIdB(w}Q&DC2^U%z=x-RdTLIvghlaOybBU@f_8Ce~FdXls%$#3cNe zh7*M4dCX@(QUg_zfWoP|OZ!ZB?k#SFRwk%Ka^&7vE= zMxv}+kqX3lDpOjaHIh(JZpvZz>Lc{ODL|TkinM&W$I2P1tmEWRX+uNhf?<~&HF&$U z*FO0g3kcoRguma~_BEZl2=(=E1fBb?$R*T}Ti8ROjiZ&D5tO zi{;_bDBW`$IhpROzysRu^*>5`J8Azq^|uGT?GJm~y&eS9`@GPi?dfvYTe*A6hjiqW z@udpZ!Nfgfrj43%I$~9=-4Do=ox{6_2T#20cYB>ZlmiWsj*e?M6VSBRP)2QT(0Hbt zM;gBw-AQ+z$ce29yY#?}ZH_h@&`zd9XIM5)mFXRHoQJ78-um6`8(@Vz+1)Vo-Y)ew zZ*;y*KLdkZ>+jHV4#M}lJKc}F{Z4WOhM$|5YYe;?nQ^9HjLeIX`9F=!VSHm_dROvs z%KpjBb2>8dy&|9W$>-Ki^3`BXj^v|ZePrT0Ad*VPX8g!WPRHiZ J`hdZ~$=^J!%-#S1 delta 376 zcmX|*F-yZx6oqe1Ok%aA(NTpgq7H%`ger6pCkLV6Ac#w=PYBoq?Nf0o6x?(Q4i%ic zIapB8!9m>o4X*wTzuSn1ckY+_xcB5;&wtExzo*?hL6dk6TO8sqtf~}5$}oftM58gw#|^Ad8TN73LL$b$5t z&JCajKS2$Ch2+W@R?&{`^;;jR(mnn=(m2(VC=bc6M0khDW-C3n(ZW*FY@6lbOR(!y zwqkoF+sScy)^6H3O)}44$?E=rTisZzWe@&hVKw{oe}-?tzEk|4Gue8%8t$1^C$>f! LX~!O>M@D`DxYIID diff --git a/website/partners/locale/nl/LC_MESSAGES/django.po b/website/partners/locale/nl/LC_MESSAGES/django.po index 5392e0d6..e745dd14 100644 --- a/website/partners/locale/nl/LC_MESSAGES/django.po +++ b/website/partners/locale/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-13 11:58+0200\n" -"PO-Revision-Date: 2016-08-13 12:00+0200\n" +"POT-Creation-Date: 2016-08-13 12:02+0200\n" +"PO-Revision-Date: 2016-08-13 12:03+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: nl\n" @@ -55,6 +55,8 @@ msgid "Main Partner" msgstr "Hoofdsponsor" #: templates/partners/index.html:38 templates/partners/index.html:65 +#: templates/partners/partner.html:81 templates/partners/vacancies.html:53 +#: templates/partners/vacancies.html:58 templates/partners/vacancies.html:89 msgid "Learn more" msgstr "Lees meer" @@ -82,3 +84,35 @@ msgstr "Plaatsnaam" #: templates/partners/partner.html:55 msgid "Website" msgstr "Website" + +#: templates/partners/partner.html:67 templates/partners/vacancies.html:5 +msgid "Vacancies" +msgstr "Vacatures" + +#: templates/partners/vacancies.html:7 +msgid "" +"Je bent student en je hebt het maar krap. De politiek wil de studenten ook " +"al niet een handje toesteken. Gelukkig hebben we bedrijven die bij ons " +"vacatures aanbieden. Dus zit je krap en wil je wat bijverdienen, of ben je " +"(bijna) afgestudeerd en wil je eens wat rondkijken, op deze pagina staan al " +"onze openstaande vacatures. Wil je als bedrijf een vacature plaatsen op onze " +"website, dan kun je contact opnemen met de voorzitter van onze " +"sponsorcommissie via sponsor@thalia.nu." +msgstr "" +"Je bent student en je hebt het maar krap. De politiek wil de studenten ook " +"al niet een handje toesteken. Gelukkig hebben we bedrijven die bij ons " +"vacatures aanbieden. Dus zit je krap en wil je wat bijverdienen, of ben je " +"(bijna) afgestudeerd en wil je eens wat rondkijken, op deze pagina staan al " +"onze openstaande vacatures. Wil je als bedrijf een vacature plaatsen op onze " +"website, dan kun je contact opnemen met de voorzitter van onze " +"sponsorcommissie via sponsor@thalia.nu." + +#: templates/partners/vacancies.html:22 +msgid "Everything" +msgstr "Alles" + +#: templates/partners/vacancies.html:69 +msgid "All vacancies" +msgstr "Alle vacatures" diff --git a/website/partners/migrations/0003_vacancy.py b/website/partners/migrations/0003_vacancy.py new file mode 100644 index 00000000..58990670 --- /dev/null +++ b/website/partners/migrations/0003_vacancy.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-13 08:47 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('partners', '0002_vacancycategory'), + ] + + operations = [ + migrations.CreateModel( + name='Vacancy', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('description', models.TextField(max_length=3072)), + ('link', models.CharField(blank=True, max_length=255, validators=[django.core.validators.URLValidator()])), + ('company_name', models.CharField(blank=True, max_length=255)), + ('company_logo', models.ImageField(blank=True, null=True, upload_to='public/partners/vacancy-logos/')), + ('categories', models.ManyToManyField(blank=True, to='partners.VacancyCategory')), + ('partner', models.ForeignKey(blank=True, help_text='When you use a partner, the company name and logo below will not be used.', null=True, on_delete=django.db.models.deletion.PROTECT, to='partners.Partner')), + ], + options={ + 'verbose_name_plural': 'Vacancies', + }, + ), + ] diff --git a/website/partners/models.py b/website/partners/models.py index 3e8216cb..ff04911f 100644 --- a/website/partners/models.py +++ b/website/partners/models.py @@ -77,3 +77,47 @@ class VacancyCategory(models.Model, metaclass=ModelTranslateMeta): class Meta: verbose_name_plural = 'Vanancy Categories' + + +class Vacancy(models.Model): + title = models.CharField(max_length=255) + description = models.TextField(max_length=3072) + link = models.CharField( + max_length=255, + blank=True, + validators=[URLValidator()] + ) + + partner = models.ForeignKey( + Partner, + on_delete=models.PROTECT, + null=True, + blank=True, + help_text="When you use a partner, the company name and logo " + + "below will not be used." + ) + + company_name = models.CharField(max_length=255, blank=True) + company_logo = models.ImageField( + upload_to='public/partners/vacancy-logos/', + null=True, + blank=True + ) + + categories = models.ManyToManyField(VacancyCategory, blank=True) + + def get_company_name(self): + if self.partner: + return self.partner.name + return self.company_name + + def get_company_logo(self): + if self.partner: + return self.partner.logo + return self.company_logo + + def __str__(self): + return self.get_company_name() + ' - ' + self.title + + class Meta: + verbose_name_plural = 'Vacancies' diff --git a/website/partners/templates/partners/partner.html b/website/partners/templates/partners/partner.html index eac85d71..e63c2d65 100644 --- a/website/partners/templates/partners/partner.html +++ b/website/partners/templates/partners/partner.html @@ -62,45 +62,38 @@
- {# todo vacancies #} - {% if partner.vacancies.all|length > 0 %} -
-

Vacatures

+ {% if vacancies.all|length > 0 %} +
+

{% trans "Vacancies" %}

-
-
- +
-
- + {% endif %} - {# todo vacancies #} {% endblock body %} diff --git a/website/partners/templates/partners/vacancies.html b/website/partners/templates/partners/vacancies.html new file mode 100644 index 00000000..1efe8ce6 --- /dev/null +++ b/website/partners/templates/partners/vacancies.html @@ -0,0 +1,140 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block body %} +

{% trans "Vacancies" %}

+

+ {% blocktrans trimmed %} + Je bent student en je hebt het maar krap. De politiek wil de studenten ook al niet een handje toesteken. Gelukkig + hebben we bedrijven die bij ons vacatures aanbieden. Dus zit je krap en wil je wat bijverdienen, of ben je (bijna) + afgestudeerd en wil je eens wat rondkijken, op deze pagina staan al onze openstaande vacatures. + + Wil je als bedrijf een vacature plaatsen op onze website, dan kun je contact opnemen met de voorzitter van onze + sponsorcommissie via sponsor@thalia.nu. + {% endblocktrans %} +

+ +
+ +
+ +
+ + +
+ {% for vacancy in vacancies %} +
+
+ {% if vacancy.get_company_logo %} + + {% endif %} +
+
+
+ {{ vacancy.get_company_name }} + {{ vacancy.title }} +
+

{{ vacancy.description|truncatechars:150 }}

+
+ {% if vacancy.partner %} + + {% trans "Learn more" %} + + {% else %} + + {% trans "Learn more" %} + + {% endif %} +
+
+
+ {% endfor %} +
+ + {% if vacancies|length > 0 %} + + {% endif %} +
+ + +{% endblock body %} \ No newline at end of file diff --git a/website/partners/urls.py b/website/partners/urls.py index 49cd9a6a..0d2fb1b2 100644 --- a/website/partners/urls.py +++ b/website/partners/urls.py @@ -6,4 +6,5 @@ app_name = "partners" urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^partners/(?P[-\w]+)$', views.partner, name='partner'), + url(r'^vacancies$', views.vacancies, name='vacancies') ] diff --git a/website/partners/views.py b/website/partners/views.py index 50104222..320355ff 100644 --- a/website/partners/views.py +++ b/website/partners/views.py @@ -1,6 +1,6 @@ from django.shortcuts import get_object_or_404, render -from partners.models import Partner +from partners.models import Partner, Vacancy, VacancyCategory from random import random @@ -19,8 +19,17 @@ def index(request): def partner(request, slug): partner = get_object_or_404(Partner, slug=slug) - return render( - request, - 'partners/partner.html', - {'partner': partner} - ) + context = { + 'partner': partner, + 'vacancies': Vacancy.objects.filter(partner=partner), + } + return render(request, 'partners/partner.html', context) + + +def vacancies(request): + context = { + 'vacancies': Vacancy.objects.all(), + 'categories': VacancyCategory.objects.all(), + } + + return render(request, 'partners/vacancies.html', context) diff --git a/website/thaliawebsite/menus.py b/website/thaliawebsite/menus.py index 342f469a..93306776 100644 --- a/website/thaliawebsite/menus.py +++ b/website/thaliawebsite/menus.py @@ -23,7 +23,7 @@ main = [ {'title': _('Calendar'), 'name': '#'}, {'title': _('Career'), 'name': 'partners:index', 'submenu': [ {'title': _('Partners'), 'name': 'partners:index'}, - {'title': _('Vacancies'), 'name': '#'}, + {'title': _('Vacancies'), 'name': 'partners:vacancies'}, ]}, {'title': _('Education'), 'name': '#', 'submenu': [ {'title': _('Book Sale'), 'name': '#'}, -- GitLab From 988848ef1913df421930304083bfaee9ece54ce0 Mon Sep 17 00:00:00 2001 From: Luuk Scholten Date: Sat, 13 Aug 2016 12:57:55 +0200 Subject: [PATCH 6/9] Showcase two sponsors in header, in a randomly ordered list --- website/partners/context_processors.py | 18 ++++++++++++++++++ .../templates/partners/showcased_partner.html | 5 +++++ website/thaliawebsite/settings/settings.py | 1 + website/thaliawebsite/templates/base.html | 12 ++++++------ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 website/partners/context_processors.py create mode 100644 website/partners/templates/partners/showcased_partner.html diff --git a/website/partners/context_processors.py b/website/partners/context_processors.py new file mode 100644 index 00000000..eba2e0ee --- /dev/null +++ b/website/partners/context_processors.py @@ -0,0 +1,18 @@ +from random import shuffle + +from partners.models import Partner + + +def showcased_partners(request): + if 'partner_sequence' not in request.session: + partner_ids = [p.id for p in Partner.objects.filter(is_active=True)] + shuffle(partner_ids) + request.session['partner_sequence'] = partner_ids + + sequence = request.session['partner_sequence'] + chosen, rest = sequence[:2], sequence[2:] + request.session['partner_sequence'] = rest + chosen + + partners = tuple(Partner.objects.get(id=id) for id in chosen) + + return {'showcased_partners': partners} diff --git a/website/partners/templates/partners/showcased_partner.html b/website/partners/templates/partners/showcased_partner.html new file mode 100644 index 00000000..4bcdc3c8 --- /dev/null +++ b/website/partners/templates/partners/showcased_partner.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/website/thaliawebsite/settings/settings.py b/website/thaliawebsite/settings/settings.py index 4beadd87..0595f02e 100644 --- a/website/thaliawebsite/settings/settings.py +++ b/website/thaliawebsite/settings/settings.py @@ -81,6 +81,7 @@ TEMPLATES = [ 'django.template.context_processors.media', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + 'partners.context_processors.showcased_partners', ], }, }, diff --git a/website/thaliawebsite/templates/base.html b/website/thaliawebsite/templates/base.html index 893cb255..2c26382e 100644 --- a/website/thaliawebsite/templates/base.html +++ b/website/thaliawebsite/templates/base.html @@ -58,15 +58,15 @@ -
- {% block partner_header_left %}{% endblock partner_header_left %} -
+ {% if showcased_partners|length > 0 %} + {% include "partners/showcased_partner.html" with partner=showcased_partners.0 position="left" %} + {% endif %} -
- {% block partner_header_right %}{% endblock partner_header_right %} -
+ {% if showcased_partners|length > 1 %} + {% include "partners/showcased_partner.html" with partner=showcased_partners.1 position="right" %} + {% endif %} -- GitLab From 5c9ead0feb9035b9527b9e545875dd6ab87508c2 Mon Sep 17 00:00:00 2001 From: Luuk Scholten Date: Sat, 13 Aug 2016 13:08:39 +0200 Subject: [PATCH 7/9] Allow partners to override site header image (the big one) --- website/partners/templates/partners/partner.html | 8 ++++++++ website/thaliawebsite/templates/base.html | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/website/partners/templates/partners/partner.html b/website/partners/templates/partners/partner.html index e63c2d65..fd444b90 100644 --- a/website/partners/templates/partners/partner.html +++ b/website/partners/templates/partners/partner.html @@ -1,6 +1,14 @@ {% extends "base.html" %} {% load i18n %} +{% block header_image %}{% spaceless %} + {% if partner.site_header %} + {{ partner.site_header.url }} + {% else %} + {{ block.super }} + {% endif %} +{% endspaceless %}{% endblock header_image %} + {% block body %}

{{ partner.name }}

diff --git a/website/thaliawebsite/templates/base.html b/website/thaliawebsite/templates/base.html index 2c26382e..141c0cea 100644 --- a/website/thaliawebsite/templates/base.html +++ b/website/thaliawebsite/templates/base.html @@ -83,7 +83,10 @@
{# todo header image #} -
+
+

{% block page_title %}{% trans "Study Association Thalia" %}{% endblock %}

-- GitLab From 3320b0bac3f277dc023850ea35b9d966310818b5 Mon Sep 17 00:00:00 2001 From: Luuk Scholten Date: Sat, 13 Aug 2016 14:00:39 +0200 Subject: [PATCH 8/9] Refactor vacancy description and partner profile to use HTML editor in backend Output is cleaned with `bleach` in the frontend --- requirements.txt | 2 ++ ...0004_add_tinymce_to_vacancy_and_partner.py | 26 +++++++++++++++++ website/partners/models.py | 5 ++-- .../partners/templates/partners/index.html | 4 +-- .../partners/templates/partners/partner.html | 6 ++-- .../templates/partners/vacancies.html | 6 ++-- website/thaliawebsite/settings/settings.py | 1 + .../thaliawebsite/templatetags/bleach_tags.py | 28 +++++++++++++++++++ website/thaliawebsite/urls.py | 2 ++ 9 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 website/partners/migrations/0004_add_tinymce_to_vacancy_and_partner.py create mode 100644 website/thaliawebsite/templatetags/bleach_tags.py diff --git a/requirements.txt b/requirements.txt index aa2635bf..e5e0266a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,5 @@ Pillow django-static-precompiler>=1.4,<2 django-sendfile==0.3.10 django-template-check # This should be in dev-requirements somehow +bleach==1.4.3 +django-tinymce==2.3.0 diff --git a/website/partners/migrations/0004_add_tinymce_to_vacancy_and_partner.py b/website/partners/migrations/0004_add_tinymce_to_vacancy_and_partner.py new file mode 100644 index 00000000..a7a67fd8 --- /dev/null +++ b/website/partners/migrations/0004_add_tinymce_to_vacancy_and_partner.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-13 11:20 +from __future__ import unicode_literals + +from django.db import migrations +import tinymce.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('partners', '0003_vacancy'), + ] + + operations = [ + migrations.AlterField( + model_name='partner', + name='company_profile', + field=tinymce.models.HTMLField(blank=True), + ), + migrations.AlterField( + model_name='vacancy', + name='description', + field=tinymce.models.HTMLField(blank=True), + ), + ] diff --git a/website/partners/models.py b/website/partners/models.py index ff04911f..b3b63714 100644 --- a/website/partners/models.py +++ b/website/partners/models.py @@ -2,6 +2,7 @@ from django.db import models from django.core.validators import RegexValidator, URLValidator from utils.translation import MultilingualField, ModelTranslateMeta +from tinymce.models import HTMLField class Partner(models.Model): @@ -14,7 +15,7 @@ class Partner(models.Model): blank=True, validators=[URLValidator()] ) - company_profile = models.TextField(max_length=3072, blank=True) + company_profile = HTMLField(blank=True) logo = models.ImageField(upload_to='public/partners/logos/') site_header = models.ImageField( upload_to='public/partners/headers/', @@ -81,7 +82,7 @@ class VacancyCategory(models.Model, metaclass=ModelTranslateMeta): class Vacancy(models.Model): title = models.CharField(max_length=255) - description = models.TextField(max_length=3072) + description = HTMLField(blank=True) link = models.CharField( max_length=255, blank=True, diff --git a/website/partners/templates/partners/index.html b/website/partners/templates/partners/index.html index 610e272b..bef45494 100644 --- a/website/partners/templates/partners/index.html +++ b/website/partners/templates/partners/index.html @@ -31,7 +31,7 @@

{{ main_partner.name }}

-

{{ main_partner.company_profile|truncatechars:425 }}

+

{{ main_partner.company_profile|striptags|truncatechars:425 }}

@@ -61,7 +61,7 @@

{{ partner.name }}

-

{{ partner.company_profile|truncatechars:180 }}

+

{{ partner.company_profile|striptags|truncatechars:180 }}

{% trans "Learn more" %} »
diff --git a/website/partners/templates/partners/partner.html b/website/partners/templates/partners/partner.html index fd444b90..16f61d42 100644 --- a/website/partners/templates/partners/partner.html +++ b/website/partners/templates/partners/partner.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load i18n %} +{% load i18n bleach_tags %} {% block header_image %}{% spaceless %} {% if partner.site_header %} @@ -18,7 +18,7 @@
- {{ partner.company_profile }} + {{ partner.company_profile|bleach }}
@@ -81,7 +81,7 @@
  • - {{ vacancy.description }} + {{ vacancy.description|bleach }} {% if vacancy.link %}

    diff --git a/website/partners/templates/partners/vacancies.html b/website/partners/templates/partners/vacancies.html index 1efe8ce6..899271ef 100644 --- a/website/partners/templates/partners/vacancies.html +++ b/website/partners/templates/partners/vacancies.html @@ -1,5 +1,5 @@ {% extends 'base.html' %} -{% load i18n %} +{% load i18n bleach_tags %} {% block body %}

    {% trans "Vacancies" %}

    @@ -46,7 +46,7 @@ {{ vacancy.get_company_name }} {{ vacancy.title }} -

    {{ vacancy.description|truncatechars:150 }}

    +

    {{ vacancy.description|striptags|truncatechars:150 }}

    {% if vacancy.partner %} @@ -80,7 +80,7 @@
    - {{ vacancy.description }} + {{ vacancy.description|bleach }} {% if vacancy.link %}

    diff --git a/website/thaliawebsite/settings/settings.py b/website/thaliawebsite/settings/settings.py index 0595f02e..94e47e1f 100644 --- a/website/thaliawebsite/settings/settings.py +++ b/website/thaliawebsite/settings/settings.py @@ -41,6 +41,7 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', # Dependencies 'static_precompiler', + 'tinymce', # Our apps 'thaliawebsite', # include for admin settings 'members', diff --git a/website/thaliawebsite/templatetags/bleach_tags.py b/website/thaliawebsite/templatetags/bleach_tags.py new file mode 100644 index 00000000..fe9b20af --- /dev/null +++ b/website/thaliawebsite/templatetags/bleach_tags.py @@ -0,0 +1,28 @@ +from __future__ import unicode_literals, print_function, absolute_import + +from bleach import clean +from django import template +from django.template.defaultfilters import stringfilter +from django.utils.safestring import mark_safe + +register = template.Library() + + +@register.filter(is_safe=True) +@stringfilter +def bleach(value): + """Bleach dangerous html from the input""" + + return mark_safe( + clean( + value, + tags=['h2', 'h3', 'p', 'a', 'div', + 'strong', 'em', 'i', 'b', 'ul', 'li', 'br', 'ol'], + attributes={ + '*': ['class'], + 'a': ['href', 'rel', 'target', 'title'], + 'img': ['alt', 'title'], + }, + strip=True + ) + ) diff --git a/website/thaliawebsite/urls.py b/website/thaliawebsite/urls.py index 8fb48e38..e7c74082 100644 --- a/website/thaliawebsite/urls.py +++ b/website/thaliawebsite/urls.py @@ -48,5 +48,7 @@ urlpatterns = [ # Default login helpers url(r'^', include('django.contrib.auth.urls')), url(r'^i18n/', include('django.conf.urls.i18n')), + # Dependencies + url(r'^tinymce/', include('tinymce.urls')), ] + static(settings.MEDIA_URL + 'public/', document_root=os.path.join(settings.MEDIA_ROOT, 'public')) -- GitLab From 5969a09b2c7597697257beb845b403340c0756fb Mon Sep 17 00:00:00 2001 From: Luuk Scholten Date: Sat, 13 Aug 2016 14:10:21 +0200 Subject: [PATCH 9/9] Add some more useful information to partner admin overviews --- website/partners/admin.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/website/partners/admin.py b/website/partners/admin.py index 7dcce565..ec76aae1 100644 --- a/website/partners/admin.py +++ b/website/partners/admin.py @@ -17,6 +17,8 @@ class PartnerImageInline(admin.StackedInline): @admin.register(Partner) class PartnerAdmin(admin.ModelAdmin): prepopulated_fields = {"slug": ("name",)} + list_display = ('name', 'is_active', 'is_main_partner',) + inlines = (PartnerImageInline,) fieldsets = ( (None, { @@ -31,8 +33,6 @@ class PartnerAdmin(admin.ModelAdmin): }), ) - inlines = (PartnerImageInline,) - @admin.register(VacancyCategory) class VacancyCategoryAdmin(TranslatedModelAdmin): @@ -42,6 +42,8 @@ class VacancyCategoryAdmin(TranslatedModelAdmin): @admin.register(Vacancy) class VacancyAdmin(admin.ModelAdmin): + list_display = ('title', 'partner', 'company_name',) + fieldsets = ( (None, { 'fields': ('title', 'description', 'link') -- GitLab