From 778a1d2d8100ad0e2bfc2ce98bf610c9961f4a5e Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Wed, 13 May 2020 12:36:25 +0530 Subject: feat: CMS App - Added cms app to INSTALLED_APPS in settings - Removed index URL from workshop_app/urls.py - Added cms urls to workshop_portal/urls.py - Added cms_base html for renderring cms - Modified static file model to save uploaded files into static location --- cms/admin.py | 6 +++++ cms/models.py | 38 +++++++++++++++++++-------- cms/templates/cms_base.html | 63 +++++++++++++++++++++++++++++++++++++++++++++ cms/urls.py | 8 ++++++ cms/views.py | 29 ++++++++++++++++++++- workshop_app/urls.py | 1 - workshop_portal/settings.py | 1 + workshop_portal/urls.py | 1 + 8 files changed, 134 insertions(+), 13 deletions(-) create mode 100644 cms/templates/cms_base.html create mode 100644 cms/urls.py diff --git a/cms/admin.py b/cms/admin.py index 8c38f3f..8918797 100644 --- a/cms/admin.py +++ b/cms/admin.py @@ -1,3 +1,9 @@ from django.contrib import admin +from cms.models import * # Register your models here. + +admin.site.register(Nav) +admin.site.register(SubNav) +admin.site.register(Page) +admin.site.register(StaticFile) diff --git a/cms/models.py b/cms/models.py index 1811a70..05b761f 100644 --- a/cms/models.py +++ b/cms/models.py @@ -1,11 +1,15 @@ +import os + +from django.core.exceptions import ValidationError +from django.core.files.storage import FileSystemStorage from django.db import models # Create your models here. class Nav(models.Model): - name = models.CharField(max=20) - link = models.CharField(max=20) + name = models.CharField(max_length=20) + link = models.CharField(max_length=20) position = models.IntegerField() def __str__(self): @@ -14,8 +18,8 @@ class Nav(models.Model): class SubNav(models.Model): nav = models.ForeignKey(Nav, on_delete=models.CASCADE) - name = models.CharField(max=20) - link = models.CharField(max=100) + name = models.CharField(max_length=20) + link = models.CharField(max_length=100) position = models.IntegerField() def __str__(self): @@ -23,10 +27,10 @@ class SubNav(models.Model): class Page(models.Model): - permalink = models.CharField(max=100, unique=True) - title = models.CharField(max=50) + permalink = models.CharField(max_length=100, unique=True) + title = models.CharField(max_length=50) imports = models.TextField(help_text='External imports like css,js files, will be placed in tag (already ' - 'includes bootstrap4 and jQuery)') + 'includes bootstrap4 and jQuery)', null=True, blank=True) content = models.TextField(help_text='Body of the page') pub_date = models.DateTimeField('date published', auto_now_add=True) @@ -34,10 +38,22 @@ class Page(models.Model): return self.title -class StaticFiles(models.Model): - filename = models.CharField(max=70, unique=True) - file = models.FileField(upload_to='static/{}'.format(filename), blank=False, - help_text='Please upload static files (images, css, js, etc) one by one') +def get_filename(instance, _): + return 'static/cms/' + str(instance.filename) + + +def validate_filename(value): + if os.path.exists('workshop_app/static/' + value): + raise ValidationError('Static file with that name already exists! Please choose a unique name. You may use ' + 'foldername/filename to upload to a folder') + + +class StaticFile(models.Model): + filename = models.CharField(max_length=70, unique=True, validators=[validate_filename]) + file = models.FileField(upload_to=get_filename, storage=FileSystemStorage(location='workshop_app', base_url='/'), + blank=False, + help_text='Please upload static file (image, css, js, etc). This file will be accessible ' + 'at static/cms/filename') def __str__(self): return self.filename diff --git a/cms/templates/cms_base.html b/cms/templates/cms_base.html new file mode 100644 index 0000000..c2683f3 --- /dev/null +++ b/cms/templates/cms_base.html @@ -0,0 +1,63 @@ + + + + + {{ page.title }} + + + + + {{ page.imports | safe }} + + + + + + +{{ page.content | safe }} + + \ No newline at end of file diff --git a/cms/urls.py b/cms/urls.py new file mode 100644 index 0000000..b0c7612 --- /dev/null +++ b/cms/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import url + +from cms import views + +urlpatterns = [ + url('^$', views.home, name='home'), + url('^(?P.+)$', views.home, name='home') +] \ No newline at end of file diff --git a/cms/views.py b/cms/views.py index 91ea44a..8a324f4 100644 --- a/cms/views.py +++ b/cms/views.py @@ -1,3 +1,30 @@ +# Create your views here. +from django.forms import model_to_dict +from django.http import Http404 from django.shortcuts import render -# Create your views here. +from cms.models import Page, Nav, SubNav + + +def home(request, permalink=''): + if permalink == '': + permalink = 'home' + page = Page.objects.filter(permalink=permalink) + nav_objs = Nav.objects.all().order_by('-position') + subnav_objects = SubNav.objects.all() + + navs = [] + + for nav in nav_objs: + nav_obj = model_to_dict(nav) + nav_obj['subnavs'] = subnav_objects.filter(nav=nav).order_by('position') + navs.insert(-1, nav_obj) + + print(navs) + + if page.exists(): + page = page.first() + else: + raise Http404() + + return render(request, 'cms_base.html', {'page': page, 'navs': navs}) diff --git a/workshop_app/urls.py b/workshop_app/urls.py index 4bb140c..84ab2fe 100644 --- a/workshop_app/urls.py +++ b/workshop_app/urls.py @@ -21,7 +21,6 @@ js_info_dict = { } urlpatterns = [ - url(r'^$', views.index, name='index'), url(r'^register/$', views.user_register), url(r'^activate_user/(?P.+)$', views.activate_user), url(r'^activate_user/$', views.activate_user), diff --git a/workshop_portal/settings.py b/workshop_portal/settings.py index 23f9f1a..bdc0b05 100644 --- a/workshop_portal/settings.py +++ b/workshop_portal/settings.py @@ -47,6 +47,7 @@ INSTALLED_APPS = [ 'workshop_app', 'statistics_app', 'teams', + 'cms', ] MIDDLEWARE = [ diff --git a/workshop_portal/urls.py b/workshop_portal/urls.py index 16bdfb3..fe83cdd 100644 --- a/workshop_portal/urls.py +++ b/workshop_portal/urls.py @@ -20,5 +20,6 @@ from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('workshop_app.urls')), + url(r'^', include('cms.urls')), ] -- cgit