소스 검색

finished pages for courses, beginning add count form

Denis Merigoux 10 년 전
부모
커밋
cdf67f3c03
7개의 변경된 파일132개의 추가작업 그리고 37개의 파일을 삭제
  1. 3 2
      LAPI/urls.py
  2. 22 0
      census/templates/addcountTemplate.html
  3. 2 1
      census/templates/baseTemplate.html
  4. 28 12
      census/templates/coursTemplate.html
  5. 8 5
      census/templates/homeTemplate.html
  6. 69 17
      census/views.py
  7. BIN
      db.sqlite3

+ 3 - 2
LAPI/urls.py

1
 from django.conf.urls import patterns, include, url
1
 from django.conf.urls import patterns, include, url
2
 from django.contrib import admin
2
 from django.contrib import admin
3
-from census.views import home
3
+from census.views import home,comptage,cours,addcount
4
 
4
 
5
 urlpatterns = patterns('census.views',
5
 urlpatterns = patterns('census.views',
6
     # Examples:
6
     # Examples:
8
     # url(r'^blog/', include('blog.urls')),
8
     # url(r'^blog/', include('blog.urls')),
9
 
9
 
10
     url(r'^admin/', include(admin.site.urls)),
10
     url(r'^admin/', include(admin.site.urls)),
11
-    url(r'^home/$', 'home'),
11
+    url(r'^accueil/$', 'home'),
12
     url(r'^$', 'home'),
12
     url(r'^$', 'home'),
13
     url(r'^comptage/$', 'comptage'),
13
     url(r'^comptage/$', 'comptage'),
14
     url(r'^cours/(?P<id_cours>\d+)$', 'cours'),
14
     url(r'^cours/(?P<id_cours>\d+)$', 'cours'),
15
+    url(r'^compter/$', 'addcount'),
15
 )
16
 )

+ 22 - 0
census/templates/addcountTemplate.html

1
+{% extends 'baseTemplate.html' %}
2
+{% block title %}Ajouter un comptage{% endblock %}
3
+{% block nav %}{% endblock %}
4
+{% block content %}
5
+<div class="container-fluid">
6
+	<div class="row">
7
+		<div class="col-md-4 col-md-offset-4">
8
+			<div class="panel panel-primary">
9
+				<div class="panel-heading">
10
+					<h2 class="panel-title">Ajouter un comptage à la base de données</h2>
11
+				</div>
12
+				<div class="panel-body">
13
+					<form action="{% url 'census.views.addcount' %}" method="post">
14
+					{% csrf_token %}
15
+					{{form}}
16
+					</form>
17
+				</div>
18
+			</div>
19
+		</div>
20
+	</div>
21
+</div>
22
+{% endblock %}

+ 2 - 1
census/templates/baseTemplate.html

46
 						{% endblock %}
46
 						{% endblock %}
47
 					</ul>
47
 					</ul>
48
 					<ul class="nav navbar-nav navbar-right">
48
 					<ul class="nav navbar-nav navbar-right">
49
-						<a class="navbar-brand" href="{% url 'census.views.home' %}">Accueil</a>
49
+						<a class="navbar-brand" href="{% url 'census.views.home' %}">Accueil – Liste des cours</a>
50
 						<a class="navbar-brand" href="{% url 'census.views.comptage' %}">Instructions de comptage</a>
50
 						<a class="navbar-brand" href="{% url 'census.views.comptage' %}">Instructions de comptage</a>
51
+						<a class="navbar-brand" href="{% url 'census.views.addcount' %}">Ajouter un comptage</a>
51
 					</ul>
52
 					</ul>
52
 				</div><!-- /.navbar-collapse -->
53
 				</div><!-- /.navbar-collapse -->
53
 			</div><!-- /.container-fluid -->
54
 			</div><!-- /.container-fluid -->

+ 28 - 12
census/templates/coursTemplate.html

4
 {% block content %}
4
 {% block content %}
5
 <div class="container-fluid">
5
 <div class="container-fluid">
6
 	<div class="well">
6
 	<div class="well">
7
-		<h1>{{course.name}} – Promotion
8
-		{% if course.promotion.number|divisibleby:2 %}
9
-			<span style='color:#D62222'>X{{course.promotion.number}}</span>
10
-		{% else %}
11
-			<span style='color:#F2E52E'>X{{course.promotion.number}}</span>
12
-		{% endif %}</h1>
13
-		<p>Nombre d'inscrits : {{course.enrolled}}</p>
7
+		<div class="row">
8
+			<div class="col-md-4">
9
+				<h1>{{course.name}}
10
+				{% if course.promotion.number|divisibleby:2 %}
11
+					(<span style='color:#D62222'>X{{course.promotion.number}}</span>)
12
+				{% else %}
13
+					(<span style='color:#F2E52E'>X{{course.promotion.number}}</span>)
14
+				{% endif %}
15
+				</h1>
16
+				<p>Nombre d'inscrits : {{course.enrolled}}</p>
17
+			</div>
18
+			<div class="col-md-8">
19
+				{% if course.totalratio != 0 %}
20
+				<h3>Taux de visibilité du cours :</h3>
21
+				<div class="progress">
22
+ 					<div class="progress-bar progress-bar-{{course.progressbarclass}}" role="progressbar"
23
+ 							aria-valuenow="{{course.totalratio}}" aria-valuemin="0" aria-valuemax="100"
24
+ 							style="width: {{course.totalratio}}%;">
25
+    					{{course.totalratio}} %
26
+  					</div>
27
+  				</div>
28
+				{% endif %}
29
+			</div>
30
+		</div>
14
 	</div>
31
 	</div>
15
 	<div class="row">
32
 	<div class="row">
16
-		{% for lesson in lessons %}
33
+		{% for lesson in course.lessons %}
17
 		<div class="col-md-4">
34
 		<div class="col-md-4">
18
 			<div class="panel panel-default">
35
 			<div class="panel panel-default">
19
 				<div class="panel-heading">
36
 				<div class="panel-heading">
23
 					{% if lesson.counts %}
40
 					{% if lesson.counts %}
24
 					<p>Estimation du taux de visibilité pour cette séance :</p>
41
 					<p>Estimation du taux de visibilité pour cette séance :</p>
25
 					<div class="progress">
42
 					<div class="progress">
26
- 						<div class="progress-bar progress-bar-info" role="progressbar"
43
+ 						<div class="progress-bar progress-bar-{{lesson.progressbarclass}}" role="progressbar"
27
  							aria-valuenow="{{lesson.totalratio}}" aria-valuemin="0" aria-valuemax="100"
44
  							aria-valuenow="{{lesson.totalratio}}" aria-valuemin="0" aria-valuemax="100"
28
  							style="width: {{lesson.totalratio}}%;">
45
  							style="width: {{lesson.totalratio}}%;">
29
-    						{{lesson.totalratio}}%
46
+    						{{lesson.totalratio}} %
30
   						</div>
47
   						</div>
31
   					</div>
48
   					</div>
32
 					<div class="list group">
49
 					<div class="list group">
33
 						{% for count in lesson.counts %}
50
 						{% for count in lesson.counts %}
34
 						<div class="list-group-item">
51
 						<div class="list-group-item">
35
-							<p>Résultat du comptage : <b>{{count.census}}/{{course.enrolled}}</b></p>
36
-  							<p>{{count.comment}}</p>
52
+							<p>Résultat du comptage : <b>{{count.census}}/{{course.enrolled}}</b>. {{count.comment}}</p>
37
   						<p style="text-align:right;font-style:italic">{{count.signature}}</p>
53
   						<p style="text-align:right;font-style:italic">{{count.signature}}</p>
38
   						</div>
54
   						</div>
39
   						{% endfor %}
55
   						{% endfor %}

+ 8 - 5
census/templates/homeTemplate.html

31
 					}
31
 					}
32
 					{% endif %}
32
 					{% endif %}
33
 					<div class="progress">
33
 					<div class="progress">
34
- 						<div class="progress-bar progress-bar-info" role="progressbar"
35
- 							aria-valuenow="{{lastcountratio}}" aria-valuemin="0" aria-valuemax="100"
36
- 							aria-valuenow="{{lastcountratio}}" aria-valuemin="0" aria-valuemax="100"
37
- 							style="width: {{lastcountratio}}%;">
38
-    						{{lastcount.census}}/{{lastcount.lesson.course.enrolled}} ({{lastcountratio}}%)
34
+ 						<div class="progress-bar progress-bar-{{lastcount.progressbarclass}}" role="progressbar"
35
+ 							aria-valuenow="{{lastcount.ratio}}" aria-valuemin="0" aria-valuemax="100"
36
+ 							aria-valuenow="{{lastcount.ratio}}" aria-valuemin="0" aria-valuemax="100"
37
+ 							style="width: {{lastcount.ratio}}%;">
38
+    						{{lastcount.census}}/{{lastcount.lesson.course.enrolled}} ({{lastcount.ratio}}%)
39
   						</div>
39
   						</div>
40
   					</div>
40
   					</div>
41
   					<p>{{lastcount.comment}}</p>
41
   					<p>{{lastcount.comment}}</p>
49
 					<h2 class="panel-title">Liste des cours</h2>
49
 					<h2 class="panel-title">Liste des cours</h2>
50
 				</div>
50
 				</div>
51
 				<div class="panel-body">
51
 				<div class="panel-body">
52
+					<p>Le pourcentage est le taux de visibilité du cours, le ratio correspond au nombre de cours comptés.
52
 					<ul class="list-group">
53
 					<ul class="list-group">
53
 						{% for course in courses %}
54
 						{% for course in courses %}
54
 							<a class="list-group-item" href="{% url 'census.views.cours' id_cours=course.id %}">{{course.name}}
55
 							<a class="list-group-item" href="{% url 'census.views.cours' id_cours=course.id %}">{{course.name}}
57
 							{% else %}
58
 							{% else %}
58
 								(<span style='color:#F2E52E'>X{{course.promotion.number}}</span>)
59
 								(<span style='color:#F2E52E'>X{{course.promotion.number}}</span>)
59
 							{% endif %}
60
 							{% endif %}
61
+							<span class="badge">{{course.nonnulllessonscount}} / {{course.lessonscount}}</span>
62
+							<span class="badge">{{course.totalratio}} %</span>
60
 							</a>
63
 							</a>
61
 						{% endfor %}
64
 						{% endfor %}
62
 					</ul>
65
 					</ul>

+ 69 - 17
census/views.py

1
 from django.shortcuts import render
1
 from django.shortcuts import render
2
 from census.models import Course,Count,Lesson
2
 from census.models import Course,Count,Lesson
3
+from django import forms
3
 
4
 
4
-# Create your views here.
5
+#Auxiliariy functions
5
 
6
 
6
-def home(request):
7
-	#Retrieving the course list
8
-	courses = Course.objects.filter(promotion__number=2014)
9
-	#Retrieving last count
10
-	lastcount = Count.objects.latest('lesson__date')
11
-	lastcountratio = round(lastcount.census/lastcount.lesson.course.enrolled*100)
12
-	
13
-	return render(request,'homeTemplate.html', {'courses' : courses, 'lastcount' : lastcount, 'lastcountratio' : lastcountratio})
14
-
15
-def comptage(request):
16
-	return render(request,'comptageTemplate.html')
7
+def getProgressBarClass(ratio):
8
+	if (ratio > 75):
9
+		return "success"
10
+	elif (ratio > 50):
11
+		return "info"
12
+	elif (ratio > 25):
13
+		return "warning"
14
+	else:
15
+		return "danger"
17
 
16
 
18
-def cours(request, id_cours):
19
-	course = Course.objects.get(id=id_cours)
20
-	lessons = Lesson.objects.filter(course=course).order_by('number')
21
-	for lesson in lessons:
17
+def getCourseStatistics(course):
18
+	course.lessons = Lesson.objects.filter(course=course).order_by('number')
19
+	course.totalsum = 0
20
+	course.nonnulllessonscount = 0
21
+	for lesson in course.lessons:
22
 		lesson.counts = Count.objects.filter(lesson=lesson)
22
 		lesson.counts = Count.objects.filter(lesson=lesson)
23
 		if (lesson.counts.count() != 0):
23
 		if (lesson.counts.count() != 0):
24
 			lesson.totalsum = 0 
24
 			lesson.totalsum = 0 
26
 				count.ratio = round(count.census/lesson.course.enrolled*100)
26
 				count.ratio = round(count.census/lesson.course.enrolled*100)
27
 				lesson.totalsum += count.census
27
 				lesson.totalsum += count.census
28
 			lesson.totalratio = round(lesson.totalsum/(lesson.counts.count()*course.enrolled)*100)
28
 			lesson.totalratio = round(lesson.totalsum/(lesson.counts.count()*course.enrolled)*100)
29
+			lesson.progressbarclass = getProgressBarClass(lesson.totalratio)
30
+			course.totalsum += lesson.totalratio
31
+			course.nonnulllessonscount += 1
29
 		else:
32
 		else:
30
 			lesson.counts = None
33
 			lesson.counts = None
31
-	return render(request, 'coursTemplate.html', {'course' : course, 'lessons' : lessons,})
34
+	if (course.lessons.count() != 0):
35
+		course.totalratio = round(course.totalsum / course.nonnulllessonscount)
36
+		course.progressbarclass = getProgressBarClass(course.totalratio)
37
+	else:
38
+		course.totalratio = 0
39
+	course.lessonscount= course.lessons.count()
40
+	return course
41
+
42
+class addCountForm(forms.Form):
43
+	course = forms.CharField(label="Cours",max_length=60)
44
+
45
+#Views
46
+
47
+def home(request):
48
+	#Retrieving the course list and the statistics
49
+	courses = Course.objects.filter(promotion__number=2014)
50
+	for course in courses:
51
+		course = getCourseStatistics(course)
52
+	#Retrieving last count
53
+	lastcount = Count.objects.latest('date')
54
+	lastcount.ratio = round(lastcount.census/lastcount.lesson.course.enrolled*100)
55
+	lastcount.progressbarclass= getProgressBarClass(lastcount.ratio)
56
+
57
+	return render(request,'homeTemplate.html', {'courses' : courses, 'lastcount' : lastcount,})
58
+
59
+def comptage(request):
60
+	return render(request,'comptageTemplate.html')
61
+
62
+def cours(request, id_cours):
63
+	course = Course.objects.get(id=id_cours)
64
+	course = getCourseStatistics(course)
65
+	return render(request, 'coursTemplate.html', {'course' : course,})
66
+
67
+def addcount(request):
68
+    # if this is a POST request we need to process the form data
69
+    if request.method == 'POST':
70
+        # create a form instance and populate it with data from the request:
71
+        form = addCountForm(request.POST)
72
+        # check whether it's valid:
73
+        if form.is_valid():
74
+            # process the data in form.cleaned_data as required
75
+            # ...
76
+            # redirect to a new URL:
77
+            return HttpResponseRedirect('/')
78
+
79
+    # if a GET (or any other method) we'll create a blank form
80
+    else:
81
+        form = addCountForm()
82
+
83
+    return render(request, 'addcountTemplate.html', {'form': form})

BIN
db.sqlite3