Merge branch 'master' into etherpad
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -4,6 +4,8 @@
|
|||||||
fet2020/files/*
|
fet2020/files/*
|
||||||
fet2020/.env/*
|
fet2020/.env/*
|
||||||
*.sqlite3
|
*.sqlite3
|
||||||
fet2020/posts/migrations/*
|
fet2020/*/migrations/*
|
||||||
fet2020/members/migrations/*
|
|
||||||
.theia/*
|
.theia/*
|
||||||
|
.flake8
|
||||||
|
migrate
|
||||||
|
run
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
from etherpad_lite import EtherpadLiteClient
|
from etherpad_lite import EtherpadLiteClient
|
||||||
from django.conf import settings
|
# from django.conf import settings
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
t=datetime.now() + timedelta(days=1)
|
t = datetime.now() + timedelta(days=1)
|
||||||
|
|
||||||
with open("/srv/andis_test/etherpad-lite/etherpad-lite/APIKEY.txt","r") as f:
|
|
||||||
k=f.read()
|
|
||||||
epc=EtherpadLiteClient( base_params={'apikey':k,}, base_url="http://localhost:9001/api")
|
|
||||||
a=epc.createAuthorIfNotExistsFor(name="andis", authorMapper="andis")
|
|
||||||
g=epc.createGroupIfNotExistsFor(groupMapper="fet")
|
|
||||||
|
|
||||||
|
with open("/srv/andis_test/etherpad-lite/etherpad-lite/APIKEY.txt", "r") as f:
|
||||||
|
k = f.read()
|
||||||
|
epc = EtherpadLiteClient(base_params={'apikey': k, }, base_url="http://localhost:9001/api")
|
||||||
|
a = epc.createAuthorIfNotExistsFor(name="andis", authorMapper="andis")
|
||||||
|
g = epc.createGroupIfNotExistsFor(groupMapper="fet")
|
||||||
|
|||||||
@@ -1,23 +1,21 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Document
|
from .models import Document
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from django.contrib.auth import views as auth_views
|
# from django.contrib.auth import views as auth_views
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Document)
|
@admin.register(Document)
|
||||||
class DocumentModelAdmin(admin.ModelAdmin):
|
class DocumentModelAdmin(admin.ModelAdmin):
|
||||||
def my_view(self,request, extra_context=None):
|
def my_view(self, request, extra_context=None):
|
||||||
return render(request,"admin/documents/preview.html")
|
return render(request, "admin/documents/preview.html")
|
||||||
|
|
||||||
def get_urls(self):
|
def get_urls(self):
|
||||||
urls = super().get_urls()
|
# urls = super().get_urls()
|
||||||
select_list_url = [ path("<int:id>/preview", self.admin_site.admin_view(self.my_view),
|
select_list_url = [
|
||||||
name='preview'),
|
path("<int:id>/preview", self.admin_site.admin_view(self.my_view), name='preview'),
|
||||||
path("preview", self.admin_site.admin_view(self.my_view),
|
path("preview", self.admin_site.admin_view(self.my_view), name='preview')
|
||||||
name='preview')
|
|
||||||
|
|
||||||
]
|
]
|
||||||
return select_list_url #+ urls
|
return select_list_url # + urls
|
||||||
|
|
||||||
#admin.site.register(Document,DocumentModelAdmin)
|
# admin.site.register(Document,DocumentModelAdmin)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
# from django.contrib.admin.apps import AdminConfig
|
||||||
|
|
||||||
|
|
||||||
class DocumentsConfig(AppConfig):
|
class DocumentsConfig(AppConfig):
|
||||||
name = 'documents'
|
name = 'documents'
|
||||||
from django.contrib.admin.apps import AdminConfig
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
class Document(models.Model):
|
class Document(models.Model):
|
||||||
key = models.CharField(max_length=200, primary_key=True)
|
key = models.CharField(max_length=200, primary_key=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
from django.test import TestCase
|
# from django.test import TestCase
|
||||||
|
|
||||||
# Create your tests here.
|
# Create your tests here.
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import documents.views as views
|
import documents.views as views
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
urlpatterns=[
|
|
||||||
|
urlpatterns = [
|
||||||
path("document/<id>", views.document)
|
path("document/<id>", views.document)
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,36 +3,37 @@ from django.shortcuts import render
|
|||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
from django.http import HttpResponseRedirect
|
# from django.http import HttpResponseRedirect
|
||||||
from django.template import RequestContext
|
# from django.template import RequestContext
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.utils.translation import ugettext_lazy as _
|
# from django.utils.translation import ugettext_lazy as _
|
||||||
import urllib
|
# import urllib
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from .models import Document
|
# from .models import Document
|
||||||
from documents import epc
|
from documents import epc
|
||||||
from documents import g as group
|
from documents import g as group
|
||||||
SERVER_URL="http://etherpad.2020.fet.at/"
|
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
SERVER_URL = "http://etherpad.2020.fet.at/"
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def document(request, id=None):
|
def document(request, id=None):
|
||||||
"""Create and session and display an embedded pad
|
"""Create and session and display an embedded pad
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Initialize some needed values
|
# Initialize some needed values
|
||||||
#pad = Document.objects.get(key=id)
|
# pad = Document.objects.get(key=id)
|
||||||
padID=id
|
padID = id
|
||||||
padLink = SERVER_URL + 'p/' + group["groupID"] + '$' + \
|
padLink = SERVER_URL + 'p/' + group["groupID"] + '$' + padID
|
||||||
padID
|
|
||||||
server = urlparse(SERVER_URL)
|
server = urlparse(SERVER_URL)
|
||||||
author = epc.createAuthorIfNotExistsFor(name=str(request.user), authorMapper=str(request.user))['authorID']
|
author = epc.createAuthorIfNotExistsFor(
|
||||||
|
name=str(request.user),
|
||||||
|
authorMapper=str(request.user)
|
||||||
|
)['authorID']
|
||||||
|
|
||||||
# Create the session on the etherpad-lite side
|
# Create the session on the etherpad-lite side
|
||||||
expires = datetime.datetime.utcnow() + datetime.timedelta(
|
expires = datetime.datetime.utcnow() + datetime.timedelta(hours=3)
|
||||||
hours=3
|
|
||||||
)
|
|
||||||
epclient = epc
|
epclient = epc
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -49,15 +50,14 @@ def document(request, id=None):
|
|||||||
'link': padLink,
|
'link': padLink,
|
||||||
'server': str(server),
|
'server': str(server),
|
||||||
'uname': str(request.user),
|
'uname': str(request.user),
|
||||||
'error': 'etherpad-lite session request returned:' +
|
'error': 'etherpad-lite session request returned:' + '"' + str(e) + '"'
|
||||||
'"' + str(e) + '"'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
)
|
)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
# Set up the response
|
# Set up the response
|
||||||
response = render(request,
|
response = render(
|
||||||
|
request,
|
||||||
'documents/pad.html',
|
'documents/pad.html',
|
||||||
{
|
{
|
||||||
'pad': padID,
|
'pad': padID,
|
||||||
@@ -65,7 +65,8 @@ def document(request, id=None):
|
|||||||
'server': str(server),
|
'server': str(server),
|
||||||
'uname': str(request.user),
|
'uname': str(request.user),
|
||||||
'error': False
|
'error': False
|
||||||
}#, context=(request)
|
}
|
||||||
|
# context=(request)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Delete the existing session first
|
# Delete the existing session first
|
||||||
@@ -88,4 +89,4 @@ def document(request, id=None):
|
|||||||
expires=expires,
|
expires=expires,
|
||||||
httponly=False
|
httponly=False
|
||||||
)
|
)
|
||||||
return response
|
return response
|
||||||
|
|||||||
@@ -1,15 +1,20 @@
|
|||||||
from django.contrib.auth.models import User
|
# from django.contrib.auth.models import User
|
||||||
from django.contrib.auth.middleware import RemoteUserMiddleware
|
from django.contrib.auth.middleware import RemoteUserMiddleware
|
||||||
import django
|
# import django
|
||||||
#import logging
|
# import logging
|
||||||
#logger=logging.getLogger("django.request")
|
# logger=logging.getLogger("django.request")
|
||||||
|
|
||||||
|
|
||||||
class FETHeaderMiddleware(RemoteUserMiddleware):
|
class FETHeaderMiddleware(RemoteUserMiddleware):
|
||||||
header="Remote-User"
|
header = "Remote-User"
|
||||||
|
|
||||||
def process_request(self, request):
|
def process_request(self, request):
|
||||||
request.META[self.header]=request.META.get(self.header, request.headers.get(self.header,None))
|
request.META[self.header] = request.META.get(
|
||||||
|
self.header,
|
||||||
|
request.headers.get(self.header, None)
|
||||||
|
)
|
||||||
super().process_request(request)
|
super().process_request(request)
|
||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
request.user.is_admin=True
|
request.user.is_admin = True
|
||||||
request.user.is_superuser=True
|
request.user.is_superuser = True
|
||||||
request.user.is_staff=True
|
request.user.is_staff = True
|
||||||
|
|||||||
@@ -12,10 +12,27 @@ https://docs.djangoproject.com/en/3.0/ref/settings/
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
# Prints and logs are written to console
|
||||||
|
# TODO: Change before release
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': False,
|
||||||
|
'handlers': {
|
||||||
|
'console': {
|
||||||
|
'class': 'logging.StreamHandler',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'root': {
|
||||||
|
'handlers': ['console'],
|
||||||
|
'level': 'DEBUG',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
SESSION_COOKIE_DOMAIN =".2020.fet.at"
|
SESSION_COOKIE_DOMAIN = ".2020.fet.at"
|
||||||
|
|
||||||
# Quick-start development settings - unsuitable for production
|
# Quick-start development settings - unsuitable for production
|
||||||
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
|
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
|
||||||
@@ -28,15 +45,14 @@ DEBUG = True
|
|||||||
|
|
||||||
ALLOWED_HOSTS = []
|
ALLOWED_HOSTS = []
|
||||||
|
|
||||||
DATA_UPLOAD_MAX_MEMORY_SIZE = 1024*1024*1024
|
DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 1024
|
||||||
# Application definition
|
# Application definition
|
||||||
CKEDITOR_UPLOAD_PATH = 'upload'
|
CKEDITOR_UPLOAD_PATH = 'upload'
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
'posts.apps.PostsConfig',
|
|
||||||
'members.apps.MembersConfig',
|
|
||||||
'documents.apps.DocumentsConfig',
|
'documents.apps.DocumentsConfig',
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
|
'django.contrib.admindocs',
|
||||||
'django.contrib.auth',
|
'django.contrib.auth',
|
||||||
'django.contrib.contenttypes',
|
'django.contrib.contenttypes',
|
||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
@@ -48,7 +64,8 @@ INSTALLED_APPS = [
|
|||||||
'rest_framework',
|
'rest_framework',
|
||||||
'django_filters',
|
'django_filters',
|
||||||
'django_static_jquery_ui',
|
'django_static_jquery_ui',
|
||||||
'django.contrib.admindocs'
|
'posts.apps.PostsConfig',
|
||||||
|
'members.apps.MembersConfig',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@@ -67,7 +84,10 @@ ROOT_URLCONF = 'fet2020.urls'
|
|||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
{
|
{
|
||||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
'DIRS': [os.path.join(BASE_DIR, 'templates'),os.path.join(BASE_DIR, 'templates_design1')],
|
'DIRS': [
|
||||||
|
os.path.join(BASE_DIR, 'templates'),
|
||||||
|
os.path.join(BASE_DIR, 'templates_design1')
|
||||||
|
],
|
||||||
'APP_DIRS': True,
|
'APP_DIRS': True,
|
||||||
'OPTIONS': {
|
'OPTIONS': {
|
||||||
'context_processors': [
|
'context_processors': [
|
||||||
@@ -140,10 +160,8 @@ STATICFILES_DIRS = [
|
|||||||
os.path.join(BASE_DIR, "static_design1"),
|
os.path.join(BASE_DIR, "static_design1"),
|
||||||
]
|
]
|
||||||
|
|
||||||
MEDIA_ROOT=os.path.join(BASE_DIR, 'files/')
|
MEDIA_ROOT = os.path.join(BASE_DIR, 'files/')
|
||||||
MEDIA_URL='/files/'
|
MEDIA_URL = '/files/'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TAGGIT_FORCE_LOWERCASE = True
|
TAGGIT_FORCE_LOWERCASE = True
|
||||||
|
|
||||||
@@ -162,5 +180,4 @@ CKEDITOR_CONFIGS = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,4 +36,4 @@ urlpatterns = [
|
|||||||
path('ckeditor/', include('ckeditor_uploader.urls')),
|
path('ckeditor/', include('ckeditor_uploader.urls')),
|
||||||
path('api/', include(router.urls)),
|
path('api/', include(router.urls)),
|
||||||
path('members/', include('members.urls')),
|
path('members/', include('members.urls')),
|
||||||
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
|
|||||||
@@ -1,22 +1,27 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.http import HttpResponse
|
# from django.http import HttpResponse
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from posts.models import Post
|
from posts.models import Post
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
posts=deque(Post.article_objects.all())
|
posts = deque(Post.article_objects.all())
|
||||||
l=len(posts)
|
|
||||||
def get_tags(lst):
|
def get_tags(lst):
|
||||||
for p in lst:
|
for p in lst:
|
||||||
for t in list(p.tags.names()):
|
for t in list(p.tags.names()):
|
||||||
yield "#"+ t
|
yield "#" + t
|
||||||
|
|
||||||
|
t = set(t for t in get_tags(posts))
|
||||||
t=set( t for t in get_tags(posts))
|
if len(posts) >= 1:
|
||||||
if l>=1:
|
featured_post = posts.popleft()
|
||||||
featured_post=posts.popleft()
|
|
||||||
else:
|
else:
|
||||||
featured_post=0
|
featured_post = 0
|
||||||
|
|
||||||
return render(request, 'home.html',{'posts':posts, 'featured_post':featured_post, "tags_list": ", ".join(t)})
|
context = {
|
||||||
|
'posts': posts,
|
||||||
|
'featured_post': featured_post,
|
||||||
|
'tags_list': ", ".join(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
return render(request, 'home.html', context)
|
||||||
|
|||||||
@@ -21,14 +21,17 @@ class MemberRoleFilter(admin.SimpleListFilter):
|
|||||||
elif self.value() == 'P':
|
elif self.value() == 'P':
|
||||||
return queryset.filter(role='P')
|
return queryset.filter(role='P')
|
||||||
|
|
||||||
|
|
||||||
class JobMemberInline(admin.TabularInline):
|
class JobMemberInline(admin.TabularInline):
|
||||||
model = JobMember
|
model = JobMember
|
||||||
extra = 0
|
extra = 0
|
||||||
|
|
||||||
|
|
||||||
class JobOverviewInline(JobMemberInline):
|
class JobOverviewInline(JobMemberInline):
|
||||||
verbose_name = "Tätigkeit"
|
verbose_name = "Tätigkeit"
|
||||||
verbose_name_plural = "Tätigkeitsübersicht"
|
verbose_name_plural = "Tätigkeitsübersicht"
|
||||||
|
|
||||||
|
|
||||||
class ActiveMemberInline(JobMemberInline):
|
class ActiveMemberInline(JobMemberInline):
|
||||||
verbose_name = "Mitglied"
|
verbose_name = "Mitglied"
|
||||||
verbose_name_plural = "Aktive Mitglieder Liste"
|
verbose_name_plural = "Aktive Mitglieder Liste"
|
||||||
@@ -36,6 +39,7 @@ class ActiveMemberInline(JobMemberInline):
|
|||||||
def get_queryset(self, request):
|
def get_queryset(self, request):
|
||||||
return JobMember.active_member.all()
|
return JobMember.active_member.all()
|
||||||
|
|
||||||
|
|
||||||
class InactiveMemberInline(JobMemberInline):
|
class InactiveMemberInline(JobMemberInline):
|
||||||
verbose_name = "Mitglied"
|
verbose_name = "Mitglied"
|
||||||
verbose_name_plural = "Inaktive Mitglieder Liste"
|
verbose_name_plural = "Inaktive Mitglieder Liste"
|
||||||
@@ -43,25 +47,29 @@ class InactiveMemberInline(JobMemberInline):
|
|||||||
def get_queryset(self, request):
|
def get_queryset(self, request):
|
||||||
return JobMember.inactive_member.all()
|
return JobMember.inactive_member.all()
|
||||||
|
|
||||||
|
|
||||||
class JobInline(admin.TabularInline):
|
class JobInline(admin.TabularInline):
|
||||||
model = Job
|
model = Job
|
||||||
extra = 0
|
extra = 0
|
||||||
|
|
||||||
|
|
||||||
class MyMemberAdmin(admin.ModelAdmin):
|
class MyMemberAdmin(admin.ModelAdmin):
|
||||||
form = MyMemberForm
|
form = MyMemberForm
|
||||||
model = Member
|
model = Member
|
||||||
list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role']
|
list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role']
|
||||||
inlines = (JobOverviewInline,)
|
inlines = (JobOverviewInline,)
|
||||||
|
|
||||||
search_fields = ['firstname', 'surname','nickname','mailaccount']
|
search_fields = ['firstname', 'surname', 'nickname', 'mailaccount']
|
||||||
list_filter = [MemberRoleFilter]
|
list_filter = [MemberRoleFilter]
|
||||||
|
|
||||||
def save_model(self, request, obj, form, change):
|
def save_model(self, request, obj, form, change):
|
||||||
obj.author = request.user
|
obj.author = request.user
|
||||||
super().save_model(request, obj, form, change)
|
super().save_model(request, obj, form, change)
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Member, MyMemberAdmin)
|
admin.site.register(Member, MyMemberAdmin)
|
||||||
|
|
||||||
|
|
||||||
class MyJobAdmin(admin.ModelAdmin):
|
class MyJobAdmin(admin.ModelAdmin):
|
||||||
form = MyJobForm
|
form = MyJobForm
|
||||||
model = Job
|
model = Job
|
||||||
@@ -74,8 +82,10 @@ class MyJobAdmin(admin.ModelAdmin):
|
|||||||
obj.author = request.user
|
obj.author = request.user
|
||||||
super().save_model(request, obj, form, change)
|
super().save_model(request, obj, form, change)
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Job, MyJobAdmin)
|
admin.site.register(Job, MyJobAdmin)
|
||||||
|
|
||||||
|
|
||||||
class MyJobGroupAdmin(admin.ModelAdmin):
|
class MyJobGroupAdmin(admin.ModelAdmin):
|
||||||
form = MyJobGroupForm
|
form = MyJobGroupForm
|
||||||
model = JobGroup
|
model = JobGroup
|
||||||
@@ -88,4 +98,5 @@ class MyJobGroupAdmin(admin.ModelAdmin):
|
|||||||
obj.author = request.user
|
obj.author = request.user
|
||||||
super().save_model(request, obj, form, change)
|
super().save_model(request, obj, form, change)
|
||||||
|
|
||||||
admin.site.register(JobGroup, MyJobGroupAdmin)
|
|
||||||
|
admin.site.register(JobGroup, MyJobGroupAdmin)
|
||||||
|
|||||||
@@ -20,16 +20,29 @@ class MyMemberForm(forms.ModelForm):
|
|||||||
'address'
|
'address'
|
||||||
]
|
]
|
||||||
|
|
||||||
widgets = {'description': CKEditorUploadingWidget(config_name='default')}
|
widgets = {
|
||||||
|
'description': CKEditorUploadingWidget(config_name='default')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class MyJobForm(forms.ModelForm):
|
class MyJobForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Job
|
model = Job
|
||||||
fields = ['name', 'shortterm', 'slug', 'job_group', 'description', 'image']
|
fields = [
|
||||||
|
'name',
|
||||||
|
'shortterm',
|
||||||
|
'slug',
|
||||||
|
'job_group',
|
||||||
|
'description',
|
||||||
|
'image'
|
||||||
|
]
|
||||||
|
|
||||||
|
widgets = {
|
||||||
|
'description': CKEditorUploadingWidget(config_name='default')
|
||||||
|
}
|
||||||
|
|
||||||
widgets = {'description': CKEditorUploadingWidget(config_name='default')}
|
|
||||||
|
|
||||||
class MyJobGroupForm(forms.ModelForm):
|
class MyJobGroupForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = JobGroup
|
model = JobGroup
|
||||||
fields = ['name', 'shortterm', 'is_pinned']
|
fields = ['name', 'shortterm', 'is_pinned']
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from django.utils.text import slugify
|
|||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
import uuid
|
# import uuid
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
|
||||||
@@ -15,10 +15,12 @@ class MemberManager(models.Manager):
|
|||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(role='A')
|
return super().get_queryset().filter(role='A')
|
||||||
|
|
||||||
|
|
||||||
class PensionManager(models.Manager):
|
class PensionManager(models.Manager):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(role='P')
|
return super().get_queryset().filter(role='P')
|
||||||
|
|
||||||
|
|
||||||
class ActiveMemberManager(models.Manager):
|
class ActiveMemberManager(models.Manager):
|
||||||
'''
|
'''
|
||||||
return a list of active member, and members who are still working
|
return a list of active member, and members who are still working
|
||||||
@@ -27,12 +29,9 @@ class ActiveMemberManager(models.Manager):
|
|||||||
date_today = timezone.now().date()
|
date_today = timezone.now().date()
|
||||||
|
|
||||||
return super().get_queryset().filter(
|
return super().get_queryset().filter(
|
||||||
Q(member__role='A') &
|
Q(member__role='A')
|
||||||
(
|
& (Q(job_end__gt=date_today) | Q(job_end__isnull=True)))
|
||||||
Q(job_end__gt=date_today) |
|
|
||||||
Q(job_end__isnull=True)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
class InactiveMemberManager(models.Manager):
|
class InactiveMemberManager(models.Manager):
|
||||||
'''
|
'''
|
||||||
@@ -42,12 +41,9 @@ class InactiveMemberManager(models.Manager):
|
|||||||
date_today = timezone.now().date()
|
date_today = timezone.now().date()
|
||||||
|
|
||||||
return super().get_queryset().filter(
|
return super().get_queryset().filter(
|
||||||
Q(member__role='P') |
|
Q(member__role='P')
|
||||||
(
|
| (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False)))
|
||||||
Q(job_end__lt=date_today + timedelta(days=1)) &
|
|
||||||
Q(job_end__isnull=False)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
class Member(models.Model):
|
class Member(models.Model):
|
||||||
firstname = models.CharField(max_length=128)
|
firstname = models.CharField(max_length=128)
|
||||||
@@ -57,21 +53,28 @@ class Member(models.Model):
|
|||||||
|
|
||||||
__choices = [
|
__choices = [
|
||||||
('A', _('Active')),
|
('A', _('Active')),
|
||||||
('P', _('Pension'))
|
('P', _('Pension')),
|
||||||
]
|
]
|
||||||
role = models.CharField(max_length=1, choices= __choices, default='A')
|
role = models.CharField(max_length=1, choices=__choices, default='A')
|
||||||
|
|
||||||
description = models.TextField(null=True, blank=True)
|
description = models.TextField(null=True, blank=True)
|
||||||
image = models.ImageField(null=True, blank=True)
|
image = models.ImageField(null=True, blank=True)
|
||||||
|
|
||||||
birthday = models.DateField(null=True, blank=True)
|
birthday = models.DateField(null=True, blank=True)
|
||||||
|
|
||||||
phone_error_msg =_((
|
phone_error_msg = _((
|
||||||
"Phone number must be entered in the format: "
|
"Phone number must be entered in the format: "
|
||||||
"+999999999'. Up to 15 digits allowed."
|
"+999999999'. Up to 15 digits allowed."
|
||||||
))
|
))
|
||||||
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message=phone_error_msg)
|
phone_regex = RegexValidator(
|
||||||
phone = models.CharField(validators=[phone_regex], max_length=17, blank=True)
|
regex=r'^\+?1?\d{9,15}$',
|
||||||
|
message=phone_error_msg,
|
||||||
|
)
|
||||||
|
phone = models.CharField(
|
||||||
|
validators=[phone_regex],
|
||||||
|
max_length=17,
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
|
||||||
address = models.TextField(null=True, blank=True)
|
address = models.TextField(null=True, blank=True)
|
||||||
|
|
||||||
@@ -90,6 +93,7 @@ class Member(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.firstname + " " + self.surname
|
return self.firstname + " " + self.surname
|
||||||
|
|
||||||
|
|
||||||
class MemberSerializer(serializers.HyperlinkedModelSerializer):
|
class MemberSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Member
|
model = Member
|
||||||
@@ -100,9 +104,10 @@ class MemberSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
'mailaccount',
|
'mailaccount',
|
||||||
'role',
|
'role',
|
||||||
'description',
|
'description',
|
||||||
'image'
|
'image',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class JobGroup(models.Model):
|
class JobGroup(models.Model):
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
shortterm = models.CharField(max_length=128)
|
shortterm = models.CharField(max_length=128)
|
||||||
@@ -111,6 +116,7 @@ class JobGroup(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class Job(models.Model):
|
class Job(models.Model):
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
shortterm = models.CharField(max_length=128)
|
shortterm = models.CharField(max_length=128)
|
||||||
@@ -139,6 +145,7 @@ class Job(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.shortterm
|
return self.shortterm
|
||||||
|
|
||||||
|
|
||||||
class JobMember(models.Model):
|
class JobMember(models.Model):
|
||||||
member = models.ForeignKey(
|
member = models.ForeignKey(
|
||||||
Member,
|
Member,
|
||||||
@@ -166,4 +173,4 @@ class JobMember(models.Model):
|
|||||||
|
|
||||||
jobmember = models.Manager()
|
jobmember = models.Manager()
|
||||||
active_member = ActiveMemberManager()
|
active_member = ActiveMemberManager()
|
||||||
inactive_member = InactiveMemberManager()
|
inactive_member = InactiveMemberManager()
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
from django.test import TestCase
|
# from django.test import TestCase
|
||||||
|
|
||||||
# Create your tests here.
|
# Create your tests here.
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ from . import views
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.index, name='members.index'),
|
path('', views.index, name='members.index'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.http import HttpResponse
|
# from django.http import HttpResponse
|
||||||
|
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
@@ -7,11 +7,11 @@ from .models import Member, Job, JobMember, JobGroup, MemberSerializer
|
|||||||
|
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework import permissions
|
from rest_framework import permissions
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
# from django_filters.rest_framework import DjangoFilterBackend
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
#members = deque(Member.all_members.all())
|
# members = deque(Member.all_members.all())
|
||||||
members = deque(Member.all_members.all())
|
members = deque(Member.all_members.all())
|
||||||
jobmembers = deque(JobMember.jobmember.all())
|
jobmembers = deque(JobMember.jobmember.all())
|
||||||
jobs = deque(Job.objects.all())
|
jobs = deque(Job.objects.all())
|
||||||
@@ -19,13 +19,14 @@ def index(request):
|
|||||||
|
|
||||||
context = {
|
context = {
|
||||||
"members": members,
|
"members": members,
|
||||||
"jobmembers" : jobmembers,
|
"jobmembers": jobmembers,
|
||||||
"jobgroups" : jobgroups,
|
"jobgroups": jobgroups,
|
||||||
"jobs" : jobs,
|
"jobs": jobs,
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(request, 'members/index.html', context)
|
return render(request, 'members/index.html', context)
|
||||||
|
|
||||||
|
|
||||||
class MemberViewSet(viewsets.ModelViewSet):
|
class MemberViewSet(viewsets.ModelViewSet):
|
||||||
"""
|
"""
|
||||||
API endpoint that allows users to be viewed or edited.
|
API endpoint that allows users to be viewed or edited.
|
||||||
@@ -34,9 +35,9 @@ class MemberViewSet(viewsets.ModelViewSet):
|
|||||||
serializer_class = MemberSerializer
|
serializer_class = MemberSerializer
|
||||||
|
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
#filter_backends = [DjangoFilterBackend]
|
# filter_backends = [DjangoFilterBackend]
|
||||||
#filterset_fields = ['legacy_id', 'slug','legacy_rubrik_id']
|
# filterset_fields = ['legacy_id', 'slug','legacy_rubrik_id']
|
||||||
lookup_field='name'
|
lookup_field = 'name'
|
||||||
|
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
obj.image = self.request.FILES.get('image')
|
obj.image = self.request.FILES.get('image')
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import django.contrib.auth.admin
|
# import django.contrib.auth.admin
|
||||||
import django.contrib.auth.models
|
# import django.contrib.auth.models
|
||||||
import taggit.admin
|
import taggit.admin
|
||||||
|
|
||||||
from django.contrib import admin, auth
|
from django.contrib import admin, auth
|
||||||
@@ -33,21 +33,27 @@ class MyPostAdmin(admin.ModelAdmin):
|
|||||||
"jquery-ui/jquery-ui.min.js",
|
"jquery-ui/jquery-ui.min.js",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class MyEventAdmin(MyPostAdmin):
|
class MyEventAdmin(MyPostAdmin):
|
||||||
form = MyEventForm
|
form = MyEventForm
|
||||||
model = Event
|
model = Event
|
||||||
list_display = ['title', 'subtitle', 'slug', 'event_start', 'public_date']
|
list_display = ['title', 'subtitle', 'slug', 'event_start', 'public_date']
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Event, MyEventAdmin)
|
admin.site.register(Event, MyEventAdmin)
|
||||||
|
|
||||||
|
|
||||||
class MyNewsAdmin(MyPostAdmin):
|
class MyNewsAdmin(MyPostAdmin):
|
||||||
form = MyNewsForm
|
form = MyNewsForm
|
||||||
model = News
|
model = News
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(News, MyNewsAdmin)
|
admin.site.register(News, MyNewsAdmin)
|
||||||
|
|
||||||
|
|
||||||
class MyFetMeetingAdmin(MyEventAdmin):
|
class MyFetMeetingAdmin(MyEventAdmin):
|
||||||
form = MyFetMeetingForm
|
form = MyFetMeetingForm
|
||||||
model = FetMeeting
|
model = FetMeeting
|
||||||
|
|
||||||
admin.site.register(FetMeeting, MyFetMeetingAdmin)
|
|
||||||
|
admin.site.register(FetMeeting, MyFetMeetingAdmin)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from ckeditor_uploader.widgets import CKEditorUploadingWidget
|
from ckeditor_uploader.widgets import CKEditorUploadingWidget
|
||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
from .models import Post, Event, News, FetMeeting
|
from .models import Post, Event, News, FetMeeting
|
||||||
@@ -8,49 +8,52 @@ class MyPostForm(forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Post
|
model = Post
|
||||||
fields = ['title', 'subtitle', 'tags', 'image', 'body', 'slug', 'author']
|
fields = ['title', 'subtitle', 'tags', 'image', 'body', 'slug', 'author']
|
||||||
|
|
||||||
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
||||||
|
|
||||||
class Media:
|
class Media:
|
||||||
js = (
|
js = (
|
||||||
'js/auto_slug.js', # automatic slag completion via ajax
|
'js/auto_slug.js', # automatic slag completion via ajax
|
||||||
'js/tag_completion.js', # to get a list for tag autocompletion via ajax
|
'js/tag_completion.js', # to get a list for tag autocompletion via ajax
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class MyNewsForm(MyPostForm):
|
class MyNewsForm(MyPostForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = News
|
model = News
|
||||||
fields = ['title', 'subtitle', 'tags', 'image', 'body', 'slug', 'author']
|
fields = ['title', 'subtitle', 'tags', 'image', 'body', 'slug', 'author']
|
||||||
|
|
||||||
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs) # to get the self.fields set
|
super().__init__(*args, **kwargs) # to get the self.fields set
|
||||||
|
|
||||||
|
|
||||||
class MyEventForm(MyPostForm):
|
class MyEventForm(MyPostForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = ['title', 'subtitle', 'tags', 'image', 'body',
|
fields = ['title', 'subtitle', 'tags', 'image', 'body',
|
||||||
'event_start', 'event_end', 'event_place', 'slug', 'author']
|
'event_start', 'event_end', 'event_place', 'slug', 'author']
|
||||||
|
|
||||||
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs) # to get the self.fields set
|
super().__init__(*args, **kwargs) # to get the self.fields set
|
||||||
|
|
||||||
self.fields['event_start'].required = True
|
self.fields['event_start'].required = True
|
||||||
self.fields['event_end'].required = True
|
self.fields['event_end'].required = True
|
||||||
|
|
||||||
if 'event_place' in self.fields:
|
if 'event_place' in self.fields:
|
||||||
self.fields['event_place'].required = True
|
self.fields['event_place'].required = True
|
||||||
|
|
||||||
|
|
||||||
class MyFetMeetingForm(MyEventForm):
|
class MyFetMeetingForm(MyEventForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FetMeeting
|
model = FetMeeting
|
||||||
fields = ['event_start', 'event_end', 'tags']
|
fields = ['event_start', 'event_end', 'tags']
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs) # to get the self.fields set
|
super().__init__(*args, **kwargs) # to get the self.fields set
|
||||||
|
|
||||||
self.fields['event_start'].required = True
|
self.fields['event_start'].required = True
|
||||||
self.fields['event_end'].required = False
|
self.fields['event_end'].required = False
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ from django.db import models
|
|||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from taggit.managers import TaggableManager
|
from taggit.managers import TaggableManager
|
||||||
|
|
||||||
#from ckeditor_uploader import RichTextUploadingField
|
# from ckeditor_uploader import RichTextUploadingField
|
||||||
import uuid
|
# import uuid
|
||||||
import re
|
import re
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
@@ -26,7 +26,8 @@ logger = logging.getLogger('posts')
|
|||||||
class PostManager(models.Manager):
|
class PostManager(models.Manager):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset()
|
return super().get_queryset()
|
||||||
|
|
||||||
|
|
||||||
class ArticleManager(models.Manager):
|
class ArticleManager(models.Manager):
|
||||||
"""
|
"""
|
||||||
Provide a query set only for "Article"
|
Provide a query set only for "Article"
|
||||||
@@ -35,10 +36,12 @@ class ArticleManager(models.Manager):
|
|||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(Q(post_type='E') | Q(post_type='N'))
|
return super().get_queryset().filter(Q(post_type='E') | Q(post_type='N'))
|
||||||
|
|
||||||
|
|
||||||
class NewsManager(models.Manager):
|
class NewsManager(models.Manager):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(~Q(is_event=True))
|
return super().get_queryset().filter(~Q(is_event=True))
|
||||||
|
|
||||||
|
|
||||||
class EventManager(models.Manager):
|
class EventManager(models.Manager):
|
||||||
"""
|
"""
|
||||||
Provide a query set only for "Events"
|
Provide a query set only for "Events"
|
||||||
@@ -47,6 +50,7 @@ class EventManager(models.Manager):
|
|||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(Q(is_event=True) & Q(post_type='E'))
|
return super().get_queryset().filter(Q(is_event=True) & Q(post_type='E'))
|
||||||
|
|
||||||
|
|
||||||
class FetMeetingManager(models.Manager):
|
class FetMeetingManager(models.Manager):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(Q(post_type='F'))
|
return super().get_queryset().filter(Q(post_type='F'))
|
||||||
@@ -62,18 +66,19 @@ class Category(models.Model):
|
|||||||
|
|
||||||
subtitle = models.CharField(max_length=500, null=True, blank=True)
|
subtitle = models.CharField(max_length=500, null=True, blank=True)
|
||||||
# Slug = Text Basierter url bestandteil zb Fetsitzung 22.1.2020 --> fetsitzung_22_1_2020 für Url
|
# Slug = Text Basierter url bestandteil zb Fetsitzung 22.1.2020 --> fetsitzung_22_1_2020 für Url
|
||||||
slug = models.SlugField(unique=True,null=True,blank=True)
|
slug = models.SlugField(unique=True, null=True, blank=True)
|
||||||
# Ein Haupt Bild für den Post
|
# Ein Haupt Bild für den Post
|
||||||
image = models.ImageField(null=True, blank=True)
|
image = models.ImageField(null=True, blank=True)
|
||||||
|
|
||||||
tags = TaggableManager(blank=True)
|
tags = TaggableManager(blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Category"
|
verbose_name = "Category"
|
||||||
verbose_name_plural = "Categories"
|
verbose_name_plural = "Categories"
|
||||||
|
|
||||||
|
|
||||||
class Post(models.Model):
|
class Post(models.Model):
|
||||||
#id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
# id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
legacy_id = models.IntegerField(null=True)
|
legacy_id = models.IntegerField(null=True)
|
||||||
legacy_rubrik_id = models.IntegerField(null=True)
|
legacy_rubrik_id = models.IntegerField(null=True)
|
||||||
# Titel des Posts
|
# Titel des Posts
|
||||||
@@ -88,11 +93,11 @@ class Post(models.Model):
|
|||||||
image = models.ImageField(null=True, blank=True)
|
image = models.ImageField(null=True, blank=True)
|
||||||
# Wer hat das geschrieben
|
# Wer hat das geschrieben
|
||||||
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
|
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
tags = TaggableManager(blank=True)
|
tags = TaggableManager(blank=True)
|
||||||
# Datum ab dem etwas öffentlich sein soll
|
# Datum ab dem etwas öffentlich sein soll
|
||||||
public_date = models.DateField('date published', null=True, blank=True, default=timezone.now)
|
public_date = models.DateField('date published', null=True, blank=True, default=timezone.now)
|
||||||
|
|
||||||
imported_from = models.CharField(max_length=200, null=True, blank=True)
|
imported_from = models.CharField(max_length=200, null=True, blank=True)
|
||||||
|
|
||||||
__choices = [
|
__choices = [
|
||||||
@@ -118,11 +123,11 @@ class Post(models.Model):
|
|||||||
# TimeStamps
|
# TimeStamps
|
||||||
date_modified = models.DateTimeField(auto_now=True)
|
date_modified = models.DateTimeField(auto_now=True)
|
||||||
date_created = models.DateTimeField(auto_now_add=True)
|
date_created = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
# Managers
|
# Managers
|
||||||
objects = PostManager()
|
objects = PostManager()
|
||||||
article_objects = ArticleManager()
|
article_objects = ArticleManager()
|
||||||
|
|
||||||
def get_tags(self):
|
def get_tags(self):
|
||||||
"""Returns assigned tags as a comma seperated list."""
|
"""Returns assigned tags as a comma seperated list."""
|
||||||
return ",".join(self.tags.names())
|
return ",".join(self.tags.names())
|
||||||
@@ -132,7 +137,7 @@ class Post(models.Model):
|
|||||||
if self.image:
|
if self.image:
|
||||||
return self.image.url
|
return self.image.url
|
||||||
else:
|
else:
|
||||||
image=self.find_an_image()
|
image = self.find_an_image()
|
||||||
if image:
|
if image:
|
||||||
return image.url
|
return image.url
|
||||||
else:
|
else:
|
||||||
@@ -145,16 +150,17 @@ class Post(models.Model):
|
|||||||
"find an image via another post"
|
"find an image via another post"
|
||||||
# TODO: Explain why this image is selected on save of the image
|
# TODO: Explain why this image is selected on save of the image
|
||||||
# Query all posts that have a slug that equals one of the tags
|
# Query all posts that have a slug that equals one of the tags
|
||||||
posts1 = Post.objects.filter(slug__in=self.tags.names()).filter(image__isnull=False)[0:1].all()
|
posts1 = Post.objects.filter(
|
||||||
|
slug__in=self.tags.names()).filter(image__isnull=False)[0:1].all()
|
||||||
if len(posts1) > 0:
|
if len(posts1) > 0:
|
||||||
return posts1.get().image
|
return posts1.get().image
|
||||||
|
|
||||||
#posts2=self.tags.similar_objects()
|
# posts2=self.tags.similar_objects()
|
||||||
#for p in posts2:
|
# for p in posts2:
|
||||||
# if p.image is not None:
|
# if p.image is not None:
|
||||||
# return p.image
|
# return p.image
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def url(self):
|
def url(self):
|
||||||
return reverse('posts.show', kwargs={"id": self.slug})
|
return reverse('posts.show', kwargs={"id": self.slug})
|
||||||
@@ -170,7 +176,8 @@ class Post(models.Model):
|
|||||||
*re.findall(r'\#([\d\w-]+)', str(self.title)))
|
*re.findall(r'\#([\d\w-]+)', str(self.title)))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "Post (%s, %s): %s " %(self.slug, self.public_date.strftime("%d.%m.%Y"), self.title)
|
return "Post (%s, %s): %s " % (self.slug, self.public_date.strftime("%d.%m.%Y"), self.title)
|
||||||
|
|
||||||
|
|
||||||
class PostSerializer(serializers.HyperlinkedModelSerializer):
|
class PostSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
@@ -185,10 +192,11 @@ class PostSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
'legacy_id',
|
'legacy_id',
|
||||||
'image',
|
'image',
|
||||||
'event_start',
|
'event_start',
|
||||||
'event_end',
|
'event_end',
|
||||||
'is_fetsitzung'
|
'is_fetsitzung',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class News(Post):
|
class News(Post):
|
||||||
objects = NewsManager()
|
objects = NewsManager()
|
||||||
|
|
||||||
@@ -197,19 +205,20 @@ class News(Post):
|
|||||||
|
|
||||||
verbose_name = "News"
|
verbose_name = "News"
|
||||||
verbose_name_plural = "News"
|
verbose_name_plural = "News"
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self.post_type:
|
if not self.post_type:
|
||||||
self.post_type = 'N'
|
self.post_type = 'N'
|
||||||
|
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class Event(Post):
|
class Event(Post):
|
||||||
objects = EventManager()
|
objects = EventManager()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
proxy = True
|
proxy = True
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
self.is_event = True
|
self.is_event = True
|
||||||
|
|
||||||
@@ -218,6 +227,7 @@ class Event(Post):
|
|||||||
|
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class FetMeeting(Event):
|
class FetMeeting(Event):
|
||||||
objects = FetMeetingManager()
|
objects = FetMeetingManager()
|
||||||
|
|
||||||
@@ -231,14 +241,14 @@ class FetMeeting(Event):
|
|||||||
self.title = "Fachschaftssitzung"
|
self.title = "Fachschaftssitzung"
|
||||||
self.slug = slugify(self.event_start.date()) + "-" + slugify(self.title)
|
self.slug = slugify(self.event_start.date()) + "-" + slugify(self.title)
|
||||||
self.body = "TODO: Agenda + Protokoll Link"
|
self.body = "TODO: Agenda + Protokoll Link"
|
||||||
|
|
||||||
#TODO
|
# TODO
|
||||||
#self.image
|
# self.image
|
||||||
|
|
||||||
self.has_protocol = True
|
self.has_protocol = True
|
||||||
self.has_agenda = True
|
self.has_agenda = True
|
||||||
|
|
||||||
#TODO
|
# TODO
|
||||||
# self.protocol_key
|
# self.protocol_key
|
||||||
# self.agenda_key
|
# self.agenda_key
|
||||||
|
|
||||||
@@ -252,4 +262,4 @@ class FetMeeting(Event):
|
|||||||
if not self.event_end:
|
if not self.event_end:
|
||||||
self.event_end = self.event_start + timedelta(hours=2)
|
self.event_end = self.event_start + timedelta(hours=2)
|
||||||
|
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|||||||
@@ -5,9 +5,8 @@ from django.utils.safestring import mark_safe
|
|||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@register.filter(is_safe=True)
|
@register.filter(is_safe=True)
|
||||||
@stringfilter
|
@stringfilter
|
||||||
def tags_to_url(value):
|
def tags_to_url(value):
|
||||||
#return "Tag to url: %s" % value
|
# return "Tag to url: %s" % value
|
||||||
return mark_safe(re.sub(r'\#([\d\w-]+)', '<a href="/posts/t/\g<1>">#\g<1></a>', value))
|
return mark_safe(re.sub(r'\#([\d\w-]+)', r'<a href="/posts/t/\g<1>">#\g<1></a>', value))
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
from django.test import TestCase
|
# from django.test import TestCase
|
||||||
|
|
||||||
# Create your tests here.
|
# Create your tests here.
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ from django.urls import path
|
|||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
|
|
||||||
urlpatterns=[
|
urlpatterns = [
|
||||||
path('func/tag_complete', views.tag_complete),
|
path('func/tag_complete', views.tag_complete),
|
||||||
path('func/slug_calc', views.slug_calc),
|
path('func/slug_calc', views.slug_calc),
|
||||||
path('t/<str:tag>', views.tags, name='posts.tags'),
|
path('t/<str:tag>', views.tags, name='posts.tags'),
|
||||||
path('', views.index, name='posts.index'),
|
path('', views.index, name='posts.index'),
|
||||||
path('<str:id>', views.show, name='posts.show'),
|
path('<str:id>', views.show, name='posts.show'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.http import HttpResponse, JsonResponse
|
from django.http import HttpResponse, JsonResponse, HttpResponseServerError
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
from django.core.cache import cache
|
# from django.core.cache import cache
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from taggit.models import Tag
|
from taggit.models import Tag
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework import permissions
|
# from rest_framework import permissions
|
||||||
|
|
||||||
from .models import Post, PostSerializer
|
from .models import Post, PostSerializer
|
||||||
|
|
||||||
@@ -20,26 +20,28 @@ from collections import deque
|
|||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
posts = deque(Post.objects.order_by('-public_date').all())
|
posts = deque(Post.objects.order_by('-public_date').all())
|
||||||
f = lambda p: p.tags
|
|
||||||
|
def f(p):
|
||||||
|
return p.tags
|
||||||
t = map(f, posts)
|
t = map(f, posts)
|
||||||
|
|
||||||
return render(request, 'posts/index.html', {"posts": posts, "tags_list": t})
|
return render(request, 'posts/index.html', {"posts": posts, "tags_list": t})
|
||||||
|
|
||||||
|
|
||||||
def tags(request,tag=""):
|
def tags(request, tag=""):
|
||||||
posts = deque(Post.objects.filter(tags__name=tag))
|
posts = deque(Post.objects.filter(tags__name=tag))
|
||||||
return render(request, 'posts/index.html', {"posts": posts, "tags_list": None})
|
return render(request, 'posts/index.html', {"posts": posts, "tags_list": None})
|
||||||
|
|
||||||
|
|
||||||
def show(request,id=None):
|
def show(request, id=None):
|
||||||
if id.isdigit() or id is int:
|
if id.isdigit() or id is int:
|
||||||
p = Post.objects.get(id=int(id))
|
p = Post.objects.get(id=int(id))
|
||||||
elif id != "" and not id is None:
|
elif id != "" and id is not None:
|
||||||
p = Post.objects.get(slug=(id))
|
p = Post.objects.get(slug=(id))
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"post": p,
|
"post": p,
|
||||||
"next": get_next_dict().get(p.slug,None),
|
"next": get_next_dict().get(p.slug, None),
|
||||||
"related_posts": p.tags.similar_objects()
|
"related_posts": p.tags.similar_objects()
|
||||||
}
|
}
|
||||||
return render(request, 'posts/show.html', context)
|
return render(request, 'posts/show.html', context)
|
||||||
@@ -77,7 +79,7 @@ def tag_complete(request):
|
|||||||
|
|
||||||
tag_objects = Tag.objects.filter(name__istartswith=term)
|
tag_objects = Tag.objects.filter(name__istartswith=term)
|
||||||
|
|
||||||
tag_array =[]
|
tag_array = []
|
||||||
for elem in tag_objects:
|
for elem in tag_objects:
|
||||||
tag_array.append(elem.name)
|
tag_array.append(elem.name)
|
||||||
|
|
||||||
@@ -87,15 +89,15 @@ def tag_complete(request):
|
|||||||
|
|
||||||
|
|
||||||
def get_next_dict():
|
def get_next_dict():
|
||||||
#TODO: Docstring
|
# TODO: Docstring
|
||||||
posts = Post.article_objects.order_by('-public_date').values('slug')
|
posts = Post.article_objects.order_by('-public_date').values('slug')
|
||||||
print(posts)
|
print(posts)
|
||||||
d = {}
|
d = {}
|
||||||
print(d)
|
print(d)
|
||||||
for k,v in enumerate(posts):
|
for k, v in enumerate(posts):
|
||||||
if k == len(posts) - 1:
|
if k == len(posts) - 1:
|
||||||
break
|
break
|
||||||
d[v['slug']] = posts[k+1]['slug']
|
d[v['slug']] = posts[k + 1]['slug']
|
||||||
print(d)
|
print(d)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
@@ -106,9 +108,9 @@ class PostViewSet(viewsets.ModelViewSet):
|
|||||||
"""
|
"""
|
||||||
queryset = Post.objects.all().order_by('-public_date')
|
queryset = Post.objects.all().order_by('-public_date')
|
||||||
serializer_class = PostSerializer
|
serializer_class = PostSerializer
|
||||||
#permission_classes = [permissions.IsAuthenticated]
|
# permission_classes = [permissions.IsAuthenticated]
|
||||||
filter_backends = [DjangoFilterBackend]
|
filter_backends = [DjangoFilterBackend]
|
||||||
filterset_fields = ['legacy_id', 'slug','legacy_rubrik_id']
|
filterset_fields = ['legacy_id', 'slug', 'legacy_rubrik_id']
|
||||||
lookup_field = 'slug'
|
lookup_field = 'slug'
|
||||||
|
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ django-ckeditor
|
|||||||
Pillow
|
Pillow
|
||||||
djangorestframework
|
djangorestframework
|
||||||
django-static-jquery-ui
|
django-static-jquery-ui
|
||||||
docutils
|
docutils
|
||||||
|
etherpad-lite
|
||||||
Reference in New Issue
Block a user