From 6527ac914db043b4c2c3fb0325a6bf198dae6b57 Mon Sep 17 00:00:00 2001 From: Hironsan Date: Mon, 6 Aug 2018 15:21:33 +0900 Subject: [PATCH] Implement project creation --- app/db.sqlite3 | Bin 262144 -> 262144 bytes app/server/static/bundle/projects.js | 2 +- app/server/static/js/projects.js | 5 +- app/server/templates/admin/admin_base.html | 8 +- app/server/templates/projects.html | 138 ++++++++++++--------- app/server/views.py | 25 +++- 6 files changed, 112 insertions(+), 66 deletions(-) diff --git a/app/db.sqlite3 b/app/db.sqlite3 index 5fc2ac29878dd1d57a0db06bbc5eeca85b5bf0c1..6e64078bd9bcc561f4c50b62f32817f65cc0c3ff 100644 GIT binary patch delta 1413 zcmaJ)4KM37ECMciJ=|Ayp%4oYZNWlsc8D zU`i1}Jn+(q2S0%(Apw0rWmL%U0_&=Y2PUoXu;#r=5g^w5#$8p{4Td$#mydY^)L!HvT=kcQXcL*bU-!8D8sE<{&` zGHU`RFMp96j)Q^*_l6bhep$wQhWI_9a2A)U#d@W2vRIn7>nCfCN(~m#zBU6VpC23X z#zyeFGvOMUcVlPp**>yFUL&s%mz*Xqkrzmd%zN*h!OOfF4P(sJ0-Or48lWBEWPp_b z%K=&emb~S+@QDyBzvaf>#vkjLP)?#F4z&?y#k>ulU+sd2mB1z z;3nLFuiz?Ngo{k}4)pnk0u`U+{CC28*V3T}dzk1Fg5Tg4d<$Dlco{CiDy%Zm8<2`7 zBM2w>pjRRp<^3J;E+{C+p*g#X3uA_)^ojl9HmY3 zgieoJ^`fVqH2heAr*3BUddB!w-bdnCv7LgRx#u3l*tt9#oD~XKF-WG zs@6nvv@tQ~*FRD#I*whoCyLFM-KgIyAgk!UCN^ zLE?ycBzo#zk5o1&`(>J&Vy(;Kaa&QW&d8-7lHfuC5suEPdw`VYJE z_aTU4(oYx1MZzp-FK#Y}yv^nC@Zmv@TtF;|&%#ki3m*%M!cpOV@*}yxGQ31u2Wtt` z+m8uOm{epFg}Kg5?fX`Zyq1$FRkZw}DaK8;xzwL?H?o+Qb+O9G={8yFgsEFG%p&F2 z7Yn+kK5F}t#3A3yKN9!wr+DB%cm4{RO!Z0MPn#e338)WrsDCFw(?s!Dg;D$Q_|BLv z{sixDRp#uHRkQ2X@c5}ymLq!*o39{fM^ z-hhjw){+6943Pb0Ib}DPr9g_jS|ElkKcOYKu}dbYoKhXkvPVuzx-V{L&p$-rod@J8 zrkT-@@P#)t@Q53nmpY~^U=7egK}`wYct;b@xW|>CDtOaN2Q*=I37>ey1FnVFg&l#{ zN2%ZEuvirdt7=?*v%737?K@Vb6w{vCxH3=63Rz=`42?SUh))kigL*U^_Un<6$Z(Kt uW@w1VGqkLW`qtm{2VTTiw`hs_Gpx4^%3FrqKV~MVNvMhR7_9aq2Y&$*6MCfp diff --git a/app/server/static/bundle/projects.js b/app/server/static/bundle/projects.js index 24acb203..9d43a622 100644 --- a/app/server/static/bundle/projects.js +++ b/app/server/static/bundle/projects.js @@ -150,7 +150,7 @@ eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn th /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n\n\nvar vm = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n el: '#projects_root',\n delimiters: ['[[', ']]'],\n data: {\n items: [],\n selectedType: 'All'\n },\n methods: {\n get_projects: async function () {\n var base_url = window.location.href.split('/').slice(0, 3).join('/');\n await axios.get(`${base_url}/api/projects`).then(response => {\n this.items = response.data;\n })\n },\n updateSelectedType: function (type) {\n this.selectedType = type;\n }\n },\n computed: {\n uniqueProjectTypes: function () {\n var types = [];\n for (var item of this.items) {\n types.push(item.project_type)\n }\n var uniqueTypes = Array.from(new Set(types));\n\n return uniqueTypes\n },\n filteredProjects: function () {\n // filter projects\n var projects = [];\n for (var item of this.items) {\n if ((this.selectedType == 'All') || (item.project_type == this.selectedType)) {\n projects.push(item)\n }\n }\n // create nested projects\n var nested_projects = [];\n for (var i = 0; i < projects.length % 3; i++) {\n var p = projects.slice(i * 3, (i + 1) * 3);\n nested_projects.push(p);\n }\n\n return nested_projects\n }\n },\n created: function () {\n this.get_projects();\n }\n});\n\n//# sourceURL=webpack:///./static/js/projects.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.js\");\n\n\nvar vm = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n el: '#projects_root',\n delimiters: ['[[', ']]'],\n data: {\n items: [],\n selectedType: 'All',\n isActive: false\n },\n methods: {\n get_projects: async function () {\n var base_url = window.location.href.split('/').slice(0, 3).join('/');\n await axios.get(`${base_url}/api/projects`).then(response => {\n this.items = response.data;\n })\n },\n updateSelectedType: function (type) {\n this.selectedType = type;\n }\n },\n computed: {\n uniqueProjectTypes: function () {\n var types = [];\n for (var item of this.items) {\n types.push(item.project_type)\n }\n var uniqueTypes = Array.from(new Set(types));\n\n return uniqueTypes\n },\n filteredProjects: function () {\n // filter projects\n var projects = [];\n for (var item of this.items) {\n if ((this.selectedType == 'All') || (item.project_type == this.selectedType)) {\n projects.push(item)\n }\n }\n // create nested projects\n var nested_projects = [];\n for (var i = 0; i < Math.ceil(projects.length / 3); i++) {\n var p = projects.slice(i * 3, (i + 1) * 3);\n nested_projects.push(p);\n }\n\n return nested_projects\n }\n },\n created: function () {\n this.get_projects();\n }\n});\n\n//# sourceURL=webpack:///./static/js/projects.js?"); /***/ }) diff --git a/app/server/static/js/projects.js b/app/server/static/js/projects.js index 1ce11cf9..1b4f0785 100644 --- a/app/server/static/js/projects.js +++ b/app/server/static/js/projects.js @@ -5,7 +5,8 @@ var vm = new Vue({ delimiters: ['[[', ']]'], data: { items: [], - selectedType: 'All' + selectedType: 'All', + isActive: false }, methods: { get_projects: async function () { @@ -38,7 +39,7 @@ var vm = new Vue({ } // create nested projects var nested_projects = []; - for (var i = 0; i < projects.length % 3; i++) { + for (var i = 0; i < Math.ceil(projects.length / 3); i++) { var p = projects.slice(i * 3, (i + 1) * 3); nested_projects.push(p); } diff --git a/app/server/templates/admin/admin_base.html b/app/server/templates/admin/admin_base.html index bac7c45c..5f8520a2 100644 --- a/app/server/templates/admin/admin_base.html +++ b/app/server/templates/admin/admin_base.html @@ -22,30 +22,32 @@ diff --git a/app/server/templates/projects.html b/app/server/templates/projects.html index 42f36386..daab24db 100644 --- a/app/server/templates/projects.html +++ b/app/server/templates/projects.html @@ -1,65 +1,86 @@ {% extends "base.html" %} {% load static %} {% block content %} -
-
-
-
-

- Hello, {{ user.get_username | title }}. -

-

- I hope you are having a great day! -

-

- - Create Project - -

+
+
+
+
+
+

+ Hello, {{ user.get_username | title }}. +

+

+ I hope you are having a great day! +

+

+ + Create Project + +

+
-
-
+ -
-
-
- -
-
-
-
-
-
-
- Placeholder image -
-
-
-
-

- [[ project.name ]] -

-

- [[ project.description.slice(0, 50) ]] -

+
+
+
+ +
+
+ + + +
+
+
+
+
+ Placeholder image +
+
+
+
+

+ [[ project.name ]] +

+

+ [[ project.description.slice(0, 50) ]] +

+
+
+ -
-
@@ -67,7 +88,6 @@
-{% endblock %} -{% block footer %} +{% endblock %} {% block footer %} {% endblock %} \ No newline at end of file diff --git a/app/server/views.py b/app/server/views.py index 44e665ab..2938b3c7 100644 --- a/app/server/views.py +++ b/app/server/views.py @@ -4,6 +4,7 @@ from itertools import chain from collections import Counter from io import TextIOWrapper +from django import forms from django.urls import reverse from django_filters.rest_framework import DjangoFilterBackend from django.http import JsonResponse, HttpResponse, HttpResponseRedirect @@ -45,11 +46,33 @@ class ProjectAdminView(LoginRequiredMixin, DetailView): template_name = 'project_admin.html' -class ProjectsView(LoginRequiredMixin, ListView): +class ProjectForm(forms.ModelForm): + + class Meta: + model = Project + fields = ('name', 'description', 'project_type', 'users') + + +class ProjectsView(LoginRequiredMixin, TemplateView): model = Project paginate_by = 100 template_name = 'projects.html' + def get_context_data(self, *, object_list=None, **kwargs): + context = super().get_context_data() + form = ProjectForm() + context['form'] = form + + return context + + def post(self, request, *args, **kwargs): + form = ProjectForm(request.POST) + if form.is_valid(): + project = form.save() + return HttpResponseRedirect(reverse('upload', args=[project.id])) + else: + return render(request, self.template_name, {'form': form}) + class DatasetView(LoginRequiredMixin, ListView): template_name = 'admin/dataset.html'