From 198431be862cea5fe369fc07bca3e435ce2f7d79 Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Thu, 7 May 2020 13:58:16 +0530 Subject: Add workshop types done without attachment files --- workshop_app/forms.py | 15 +++++- .../templates/workshop_app/add_workshop_type.html | 50 ++++++++++++++++++ .../workshop_app/workshop_type_details.html | 33 +++++++++--- .../templates/workshop_app/workshop_type_list.html | 60 ++++------------------ workshop_app/urls.py | 3 +- workshop_app/views.py | 23 +++++++-- 6 files changed, 121 insertions(+), 63 deletions(-) create mode 100644 workshop_app/templates/workshop_app/add_workshop_type.html diff --git a/workshop_app/forms.py b/workshop_app/forms.py index 334bd4e..fcb34c4 100644 --- a/workshop_app/forms.py +++ b/workshop_app/forms.py @@ -3,7 +3,7 @@ from string import punctuation, digits from django import forms from django.utils import timezone -from .models import (Profile, Workshop, ProfileComments, department_choices, title, source, states) +from .models import (Profile, Workshop, ProfileComments, department_choices, title, source, states, WorkshopType) try: from string import letters @@ -189,3 +189,16 @@ class ProfileCommentsForm(forms.ModelForm): widgets = { 'comments': forms.CharField(), } + + +class WorkshopTypeForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super(WorkshopTypeForm, self).__init__(*args, **kwargs) + for field in self.visible_fields(): + field.field.widget.attrs['class'] = 'form-control' + field.field.widget.attrs['placeholder'] = field.label + field.field.widget.attrs['rows'] = 6 + + class Meta: + model = WorkshopType + exclude = [] diff --git a/workshop_app/templates/workshop_app/add_workshop_type.html b/workshop_app/templates/workshop_app/add_workshop_type.html new file mode 100644 index 0000000..ed28b03 --- /dev/null +++ b/workshop_app/templates/workshop_app/add_workshop_type.html @@ -0,0 +1,50 @@ +{% extends 'workshop_app/base.html' %} + +{% block title %} + Add new Workshop type +{% endblock %} + +{% block content %} +
+

New Workshop Type

+
+
+
+
Workshop Name :
+
+
{{ form.name }}
+
{{ form.name.errors }}
+
+ +
+
+
Duration :
+
+
{{ form.duration }}
+
{{ form.duration.help_text }}
+
{{ form.duration.errors }}
+
+
+
+
Description :
+
+
{{ form.description }}
+
{{ form.description.errors }}
+
+
+
+
Terms and Conditions :
+
+
{{ form.terms_and_conditions }}
+
{{ form.terms_and_conditions.errors }}
+
+
+ +
+
+ +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/workshop_app/templates/workshop_app/workshop_type_details.html b/workshop_app/templates/workshop_app/workshop_type_details.html index b8d6559..298d976 100644 --- a/workshop_app/templates/workshop_app/workshop_type_details.html +++ b/workshop_app/templates/workshop_app/workshop_type_details.html @@ -1,23 +1,40 @@ - {% extends 'workshop_app/base.html' %} {% block title %} - View Workshop details + View Workshop details {% endblock %} {% block extra %} - + - - + + {% endblock %} {% block content %} -
- {{ workshop_type.description | safe }} -
+
+

Workshop Details

+ + + + + + + + + + + + + + + + + +
Workshop Name :{{ workshop_type.name }}
Duration :{{ workshop_type.duration }}
Description :{{ workshop_type.description }}
Terms and Conditions :{{ workshop_type.terms_and_conditions }}
+
{% endblock %} diff --git a/workshop_app/templates/workshop_app/workshop_type_list.html b/workshop_app/templates/workshop_app/workshop_type_list.html index 0531864..a3d9c6e 100644 --- a/workshop_app/templates/workshop_app/workshop_type_list.html +++ b/workshop_app/templates/workshop_app/workshop_type_list.html @@ -4,55 +4,16 @@ View List of available Workshops {% endblock %} -{% block extra %} - - - - - - - {% endblock %} - {% block content %} - +
+

Workshop Types

+
+ {% if request.user.profile.position == 'instructor' %} + + + +
+ {% endif %}
@@ -60,6 +21,7 @@ + @@ -119,5 +81,5 @@ - + {% endblock %} diff --git a/workshop_app/urls.py b/workshop_app/urls.py index 4bb140c..76a0be6 100644 --- a/workshop_app/urls.py +++ b/workshop_app/urls.py @@ -32,6 +32,7 @@ urlpatterns = [ url(r'^my_workshops/$', views.my_workshops), url(r'^propose_workshop/$', views.propose_workshop), url(r'^workshop_types/$', views.workshop_type_list), - url(r'^workshop_type_details/([1-9][0-9]*)$', views.workshop_type_details), + url(r'^workshop_type_details/([1-9][0-9]*)$', views.workshop_type_details, name='workshop_type_details'), + url(r'^add_workshop_type$', views.add_workshop_type, name='add_workshop_type'), url(r'^view_profile/([1-9][0-9]*)$', views.view_comment_profile), ] diff --git a/workshop_app/views.py b/workshop_app/views.py index 5d0525c..d71f066 100644 --- a/workshop_app/views.py +++ b/workshop_app/views.py @@ -1,3 +1,5 @@ +from django.urls import reverse + try: from StringIO import StringIO as string_io except ImportError: @@ -6,13 +8,13 @@ from datetime import datetime from django.contrib.auth import login, logout, authenticate from django.contrib.auth.decorators import login_required -from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.core.paginator import Paginator from django.shortcuts import render, redirect from django.utils import timezone from .forms import ( UserRegistrationForm, UserLoginForm, - ProfileForm, WorkshopForm + ProfileForm, WorkshopForm, WorkshopTypeForm ) from .models import ( Profile, User, @@ -360,13 +362,26 @@ def workshop_type_list(request): workshop_types = WorkshopType.objects.all() paginator = Paginator(workshop_types, 12) # Show upto 12 workshops per page - page = request.GET.get('page') - workshop_type = paginator.get_page(paginator.num_pages) + workshop_type = paginator.get_page(page) return render(request, 'workshop_app/workshop_type_list.html', {'workshop_type': workshop_type}) +@login_required +def add_workshop_type(request): + if not is_instructor(request.user): + return redirect(get_landing_page(request.user)) + if request.method == 'POST': + form = WorkshopTypeForm(request.POST) + if form.is_valid(): + form_data = form.save() + return redirect(reverse('workshop_type_details', args=[form_data.id])) + else: + form = WorkshopTypeForm + return render(request, 'workshop_app/add_workshop_type.html', {'form': form}) + + @login_required def view_comment_profile(request, user_id): """instructor can view/post comments on coordinator profile """ -- cgit From a06daa5d5bbb7225c52292e6b5cfeb624d668bdd Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Thu, 7 May 2020 19:39:09 +0530 Subject: File upload done --- workshop_app/forms.py | 13 ++- workshop_app/models.py | 2 +- .../templates/workshop_app/edit_workshop_type.html | 102 +++++++++++++++++++++ workshop_app/urls.py | 2 +- workshop_app/views.py | 36 +++++++- 5 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 workshop_app/templates/workshop_app/edit_workshop_type.html diff --git a/workshop_app/forms.py b/workshop_app/forms.py index fcb34c4..4bef28c 100644 --- a/workshop_app/forms.py +++ b/workshop_app/forms.py @@ -1,9 +1,11 @@ from string import punctuation, digits from django import forms +from django.forms import inlineformset_factory from django.utils import timezone -from .models import (Profile, Workshop, ProfileComments, department_choices, title, source, states, WorkshopType) +from .models import (Profile, Workshop, ProfileComments, department_choices, title, source, states, WorkshopType, + AttachmentFile) try: from string import letters @@ -202,3 +204,12 @@ class WorkshopTypeForm(forms.ModelForm): class Meta: model = WorkshopType exclude = [] + + +class AttachmentFileForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super(AttachmentFileForm, self).__init__(*args, **kwargs) + + class Meta: + model = AttachmentFile + exclude = ['workshop_type'] diff --git a/workshop_app/models.py b/workshop_app/models.py index b35d9a7..b43600f 100644 --- a/workshop_app/models.py +++ b/workshop_app/models.py @@ -145,7 +145,7 @@ class WorkshopType(models.Model): class AttachmentFile(models.Model): - attachments = models.FileField(upload_to=attachments, blank=True, + attachments = models.FileField(upload_to=attachments, blank=False, help_text='Please upload workshop documents one by one, \ ie.workshop schedule, instructions etc. \ Please Note: Name of Schedule file should be similar to \ diff --git a/workshop_app/templates/workshop_app/edit_workshop_type.html b/workshop_app/templates/workshop_app/edit_workshop_type.html new file mode 100644 index 0000000..9c883d7 --- /dev/null +++ b/workshop_app/templates/workshop_app/edit_workshop_type.html @@ -0,0 +1,102 @@ +{% extends 'workshop_app/base.html' %} + +{% block title %} + Add new Workshop type +{% endblock %} + +{% block extra-dependencies %} +{% endblock %} + +{% block extra-custom-scripts %} + + +{% endblock %} + +{% block content %} +
+

View / Edit Workshop Type

+
+
+
+
Workshop Name :
+
+
+
{{ form.name }}
+
+
+
{{ form.name.errors }}
+
+
+ +
+
+
Duration :
+
+
+
{{ form.duration }}
+
+
+
{{ form.duration.help_text }}
+
+
+
{{ form.duration.errors }}
+
+
+
+
+
Description :
+
+
+
{{ form.description }}
+
+
+
{{ form.description.errors }}
+
+
+
+
+
Terms and Conditions :
+
+
+
{{ form.terms_and_conditions }}
+
+
+
{{ form.terms_and_conditions.errors }}
+
+
+
+ +

Attachments

+ {{ form_file.management_form }} + {{ form_file.non_form_errors }} + {% for form in form_file %} +
+ {% for field in form %} +
+
{{ field }}
+
+ {% endfor %} +
+
+ {% endfor %} +
+
+ +
+
+ +
+



+ +{% endblock %} \ No newline at end of file diff --git a/workshop_app/urls.py b/workshop_app/urls.py index 76a0be6..37b56d5 100644 --- a/workshop_app/urls.py +++ b/workshop_app/urls.py @@ -31,7 +31,7 @@ urlpatterns = [ url(r'^edit_profile/$', views.edit_profile), url(r'^my_workshops/$', views.my_workshops), url(r'^propose_workshop/$', views.propose_workshop), - url(r'^workshop_types/$', views.workshop_type_list), + url(r'^workshop_types/$', views.workshop_type_list, name='workshop_type_list'), url(r'^workshop_type_details/([1-9][0-9]*)$', views.workshop_type_details, name='workshop_type_details'), url(r'^add_workshop_type$', views.add_workshop_type, name='add_workshop_type'), url(r'^view_profile/([1-9][0-9]*)$', views.view_comment_profile), diff --git a/workshop_app/views.py b/workshop_app/views.py index d71f066..0f68cfb 100644 --- a/workshop_app/views.py +++ b/workshop_app/views.py @@ -1,3 +1,4 @@ +from django.forms import inlineformset_factory, model_to_dict from django.urls import reverse try: @@ -19,7 +20,7 @@ from .forms import ( from .models import ( Profile, User, Workshop, - WorkshopType + WorkshopType, AttachmentFile ) from .send_mails import send_email @@ -340,13 +341,44 @@ def propose_workshop(request): ) +@login_required def workshop_type_details(request, workshop_type_id): """Gives the types of workshop details """ user = request.user if user.is_superuser: return redirect("/admin") - workshop_type = WorkshopType.objects.get(id=workshop_type_id) + workshop_type = WorkshopType.objects.filter(id=workshop_type_id) + if workshop_type.exists(): + workshop_type = workshop_type.first() + else: + return redirect(reverse('workshop_type_list')) + + qs = AttachmentFile.objects.filter(workshop_type=workshop_type) + AttachmentFileFormSet = inlineformset_factory(WorkshopType, AttachmentFile, fields=['attachments'], + can_delete=False, extra=(qs.count() + 1)) + + if is_instructor(user): + if request.method == 'POST': + form = WorkshopTypeForm(request.POST, instance=workshop_type) + form_file = AttachmentFileFormSet(request.POST, request.FILES, instance=form.instance) + if form.is_valid(): + form_data = form.save() + for file in form_file: + if file.is_valid() and file.clean() and file.clean()['attachments']: + if file.cleaned_data['id']: + file.cleaned_data['id'].delete() + file.save() + return redirect(reverse('workshop_type_details', args=[form_data.id])) + else: + print(request.POST) + print(form_file.errors) + else: + form = WorkshopTypeForm(instance=workshop_type) + form_file = AttachmentFileFormSet() + for subform, data in zip(form_file, qs): + subform.initial = model_to_dict(data) + return render(request, 'workshop_app/edit_workshop_type.html', {'form': form, 'form_file': form_file}) return render( request, 'workshop_app/workshop_type_details.html', {'workshop_type': workshop_type} -- cgit From c72ac71318caf14d559074a4b02f5e14afcff2e0 Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Thu, 7 May 2020 20:22:40 +0530 Subject: File delete done --- .../templates/workshop_app/edit_workshop_type.html | 16 ++++++++++++---- workshop_app/urls.py | 1 + workshop_app/views.py | 12 ++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/workshop_app/templates/workshop_app/edit_workshop_type.html b/workshop_app/templates/workshop_app/edit_workshop_type.html index 9c883d7..b756f39 100644 --- a/workshop_app/templates/workshop_app/edit_workshop_type.html +++ b/workshop_app/templates/workshop_app/edit_workshop_type.html @@ -71,11 +71,19 @@ {{ form_file.non_form_errors }} {% for form in form_file %}
- {% for field in form %} -
-
{{ field }}
+
+
+ {% for field in form %} +
{{ field }}
+ {% endfor %}
- {% endfor %} + {% if form.id.value %} +
+ +
+ {% endif %} +
+

{% endfor %} diff --git a/workshop_app/urls.py b/workshop_app/urls.py index 37b56d5..a805e59 100644 --- a/workshop_app/urls.py +++ b/workshop_app/urls.py @@ -34,5 +34,6 @@ urlpatterns = [ url(r'^workshop_types/$', views.workshop_type_list, name='workshop_type_list'), url(r'^workshop_type_details/([1-9][0-9]*)$', views.workshop_type_details, name='workshop_type_details'), url(r'^add_workshop_type$', views.add_workshop_type, name='add_workshop_type'), + url(r'^delete_attachment_file/([1-9][0-9]*)$', views.delete_attachment_file, name='delete_attachment_file'), url(r'^view_profile/([1-9][0-9]*)$', views.view_comment_profile), ] diff --git a/workshop_app/views.py b/workshop_app/views.py index 0f68cfb..d24afa0 100644 --- a/workshop_app/views.py +++ b/workshop_app/views.py @@ -385,6 +385,18 @@ def workshop_type_details(request, workshop_type_id): ) +@login_required +def delete_attachment_file(request, file_id): + if not is_instructor(request.user): + return redirect(get_landing_page(request.user)) + file = AttachmentFile.objects.filter(id=file_id) + if file.exists(): + file = file.first() + file.delete() + return redirect(reverse('workshop_type_details', args=[file.workshop_type.id])) + return redirect(reverse('workshop_type_list')) + + def workshop_type_list(request): """Gives the details for types of workshops.""" user = request.user -- cgit From 6620c14b338c989a610cae10bb9962f3fe550cbf Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Thu, 14 May 2020 16:53:38 +0530 Subject: URL problems fixed --- workshop_app/urls.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workshop_app/urls.py b/workshop_app/urls.py index 5888115..0e90ee3 100644 --- a/workshop_app/urls.py +++ b/workshop_app/urls.py @@ -31,8 +31,8 @@ urlpatterns = [ url(r'^change_workshop_date/(?P\d+)$', views.change_workshop_date, name='change_workshop_date'), url(r'^propose_workshop/$', views.propose_workshop), url(r'^add_workshop_type$', views.add_workshop_type, name='add_workshop_type'), - url(r'^delete_attachment_file/([1-9][0-9]*)$', views.delete_attachment_file, name='delete_attachment_file'), + url(r'^delete_attachment_file/(?P\d+)$', views.delete_attachment_file, name='delete_attachment_file'), url(r'^workshop_types/$', views.workshop_type_list), - url(r'^workshop_type_details/(?P\d+)$', views.workshop_type_details), - url(r'^view_profile/(?P\d+)$', views.view_comment_profile, name='view_profile'), + url(r'^workshop_type_details/(?P\d+)$', views.workshop_type_details, name='workshop_type_details'), + url(r'^view_profile/(?P\d+)$', views.view_comment_profile, name='view_profile'), ] -- cgit
id Workshop Name Workshop DurationAction