joeni

views.py

1
from django.shortcuts import render
2
import datetime
3
from django.urls import reverse # Why?
4
from django.utils.translation import gettext as _
5
from .models import *
6
from .forms import *
7
import administration
8
from django.contrib.auth.decorators import login_required
9
from joeni.constants import current_academic_year
10
11
@login_required
12
def index(request):
13
    """ Starting page regarding the courses. This serves two specific groups:
14
    - Students: Displays all courses that this student has in his/her curriculum
15
                for this academic year. Requires the curriculum to be accepted.
16
    - Staff: Displays all courses in which the staff member is part of the
17
             educating team, or is otherwise related to the course.
18
    Users who are not logged in will be sent to the login page.
19
    """
20
    template = "courses/index.djhtml"
21
    courses = request.user.user_data.current_courses()
22
23
    context = {
24
        'courses': courses,
25
        }
26
27
    return render(request, template, context)
28
29
@login_required
30
def course(request, course_slug):
31
    template = "courses/course.djhtml"
32
    course_ = Course.objects.get(slug_name=course_slug)
33
34
    if request.method == 'POST':
35
        uploads = UploadFormSet(request.POST, request.FILES, prefix='uploads')
36
        if uploads.is_valid():
37
            uploads.save(commit=False)
38
            for new_upload in uploads.new_objects:
39
                new_upload.course = course_
40
            uploads.save()
41
            request.method = 'GET'
42
            return course(request, course_slug)
43
    else:
44
        uploads = UploadFormSet(
45
            queryset=Upload.objects.filter(course=course_).filter(student=request.user),
46
            prefix="uploads",
47
            )
48
    # Check if user can see this page
49
    if request.user.user_data.is_student:
50
        if course_ not in request.user.user_data.current_courses():
51
            """ I'm currently just redirecting to the index page, but maybe it's
52
            just as good to make an announcement that this course cannot be
53
            used by this user. """
54
            return index(request)
55
56
    context = {
57
        'course': course_,
58
        'main_color': course_.color,
59
        'announcements': Announcement.objects.filter(course=course_),
60
        'assignments': Assignment.objects.filter(course=course_),
61
        'course_items': CourseItem.objects.filter(course=course_),
62
        'study-groups': StudyGroup.objects.filter(course=course_),
63
        #'uploads': Upload.objects.filter(course=course).filter(student=request.user)
64
        }
65
    if request.user.user_data.is_student:
66
        context['upload_form'] = UploadForm()
67
    #else:
68
        context['student_list'] = administration.models.CourseResult.objects.filter(course_programme__course=course_)#.filter(year=current_academic_year()),
69
        # FIXME I disabled the year filter for testing purposes. Enable in deployment.
70
71
    return render(request, template, context)
72
73
# TODO: Find a way to see if it's possible to require some permissions and to
74
# put them in a decorator
75
#@permission_required
76
@login_required
77
def new_item(request, course_slug):
78
    template = "courses/new_item.djhtml"
79
    course = Course.objects.get(slug_name=course_slug)
80
81
    if request.user.user_data.is_student or request.user not in course.course_team:
82
        # Students can't add new items. Redirect to index
83
        # Also redirect people who are not part of the course team
84
        redirect('courses-index')
85
    # Now able to assume user is allowed to add items to this course
86
87
    context = {
88
        'course': course,
89
        'announcements': Announcement.objects.filter(course=course),
90
        'assignments': Assignment.objects.filter(course=course),
91
        'course-items': CourseItem.objects.filter(course=course),
92
        'study-groups': StudyGroup.objects.filter(course=course),
93
        'uploads': Upload.objects.filter(course=course)
94
        }
95
    return render(request, template, context)
96
97
def upload(request):
98
    return render(request, template, context)
99
100
#@create_context  # TODO
101
@login_required
102
def course_results(request, course_slug):
103
    template = "courses/course_results.djhtml"
104
    context = dict()
105
    course_ = Course.objects.get(slug_name=course_slug)
106
    if request.method == 'POST':
107
        course_results = CourseResultFormSet(request.POST, prefix='course_results')
108
        if course_results.is_valid():
109
            course_results.save()
110
            request.method = 'GET'
111
            return course(request, course_slug)
112
    else:
113
        course_results = CourseResultFormSet(
114
            #queryset=administration.models.CourseResult.objects.filter(course_programme__course=course_).filter(year=current_academic_year()),
115
            queryset=administration.models.CourseResult.objects.filter(course_programme__course=course_),
116
            prefix="course_results",
117
            )
118
119
    context['course'] = course_
120
    context['course_results'] = course_results
121
    return render(request, template, context)
122
123
@login_required
124
def course_attendance(request, course_slug):
125
    template = "courses/attendance.djhtml"
126
    context = dict()
127
    course = Course.objects.get(slug_name=course_slug)
128
    context['course'] = course
129
    context['student_list'] = administration.models.CourseResult.objects.filter(course_programme__course=course)#.filter(year=current_academic_year()),
130
    return render(request, template, context)
131
132
@login_required
133
def edit_course_items(request, course_slug):
134
    # TODO Only allow people on the course team to this page!
135
    template = "courses/edit_course_items.djhtml"
136
    context = dict()
137
    course_ = Course.objects.get(slug_name=course_slug)
138
    if request.method == 'POST':
139
        assignments = AssignmentFormSet(request.POST, prefix='assignments')
140
        announcements = AnnouncementFormSet(request.POST, prefix='announcements')
141
        course_items = CourseItemFormSet(request.POST, request.FILES, prefix='course_items')
142
        #course_results = CourseResultFormSet(request.POST, prefix='course_results')
143
        if assignments.is_valid() and announcements.is_valid() and course_items.is_valid(): #and course_results.is_valid():
144
            assignments.save(commit=False)
145
            announcements.save(commit=False)
146
            course_items.save(commit=False)
147
            #course_results.save(commit=False)
148
            for new_assignment in assignments.new_objects:
149
                new_assignment.course = course_
150
            for new_announcement in announcements.new_objects:
151
                new_announcement.course = course_
152
            for new_course_item in course_items.new_objects:
153
                new_course_item.course = course_
154
            #for new_course_result in course_results.new_objects:
155
                #new_coutse_result.course = course_
156
            assignments.save()
157
            announcements.save()
158
            course_items.save()
159
            #course_results.save()
160
            request.method == 'GET'
161
            return course(request, course_slug)
162
    else:
163
        assignments = AssignmentFormSet(
164
            queryset=Assignment.objects.filter(course=course_),
165
            prefix="assignments",
166
            )
167
        announcements = AnnouncementFormSet(
168
            queryset=Announcement.objects.filter(course=course_),
169
            prefix="announcements",
170
            )
171
        course_items = CourseItemFormSet(
172
            queryset=CourseItem.objects.filter(course=course_),
173
            prefix="course_items",
174
            )
175
        #course_results = CourseResultFormSet(
176
            #queryset=administration.models.CourseResult.objects.filter(course_programme__course=course_).filter(year=current_academic_year()),
177
            #prefix="course_results",
178
            #)
179
180
    context['course'] = course_
181
    context['assignments'] = assignments
182
    context['announcements'] = announcements
183
    context['course_items'] = course_items
184
    #context['course_results'] = course_results
185
    return render(request, template, context)
186
187
188
189
@login_required
190
def groups(request):
191
    pass
192
193
def fiche(request, course_slug):
194
    """Displays the fiche for the given course. Includes information about all
195
    course programs."""
196
    template = "courses/fiche.djhtml"
197
    context = dict()
198
    course = Course.objects.get(slug_name=course_slug)
199