diff --git a/app/db.sqlite3 b/app/db.sqlite3 index 5fc2ac29..6e64078b 100644 Binary files a/app/db.sqlite3 and b/app/db.sqlite3 differ 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'