From 4cbfaf96c0e5f59e56c69a9262dab46aea37e570 Mon Sep 17 00:00:00 2001 From: karan-modh Date: Tue, 2 Oct 2018 23:09:39 +0530 Subject: [PATCH 1/6] Added API Endpoint for Mentors-List --- src/account/api/serializers.py | 10 ++++++++++ src/account/api/tests.py | 8 ++++++++ src/account/api/urls.py | 3 ++- src/account/api/views.py | 10 ++++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/account/api/serializers.py b/src/account/api/serializers.py index 63cd5e3..4b0b8bf 100644 --- a/src/account/api/serializers.py +++ b/src/account/api/serializers.py @@ -21,3 +21,13 @@ class MentorProfileSerializer(serializers.ModelSerializer): class Meta: model = MentorProfile fields = '__all__' + + +class MentorsListSerializer(serializers.ModelSerializer): + first_name = serializers.CharField(source='user.first_name') + last_name = serializers.CharField(source='user.last_name') + email = serializers.EmailField(source='user.email') + + class Meta: + model = MentorProfile + fields = ('first_name', 'last_name', 'email', 'phone', 'about_me') diff --git a/src/account/api/tests.py b/src/account/api/tests.py index 0d1d64a..92eada0 100644 --- a/src/account/api/tests.py +++ b/src/account/api/tests.py @@ -142,3 +142,11 @@ def test_user_with_student_profile(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.content.decode('utf-8'), '{"type":"student-profile","id":%s}' % self.student_profile.id) + + +class MentorsListViewSetTest(TestCase): + + def test_status_OK(self): + response = self.client.get(reverse('api:account:all-mentors-list')) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.content.decode('utf-8'), '[]') diff --git a/src/account/api/urls.py b/src/account/api/urls.py index 9e34389..39a4f98 100644 --- a/src/account/api/urls.py +++ b/src/account/api/urls.py @@ -1,5 +1,5 @@ from rest_framework.routers import DefaultRouter -from account.api.views import StudentProfileViewSet, MentorProfileViewSet, UserViewSet +from account.api.views import StudentProfileViewSet, MentorProfileViewSet, UserViewSet, MentorsListViewSet from .views import AuthenticationCheckAPIView from django.urls import path @@ -8,6 +8,7 @@ router = DefaultRouter() router.register(r'student-profile', StudentProfileViewSet, base_name='student-profile') router.register(r'mentor-profile', MentorProfileViewSet, base_name='mentor-profile') +router.register(r'all-mentors', MentorsListViewSet, base_name='all-mentors') router.register(r'user', UserViewSet, base_name='user') urlpatterns = router.urls + [path('auth-check/', AuthenticationCheckAPIView.as_view(), name='auth-check')] diff --git a/src/account/api/views.py b/src/account/api/views.py index fbd6f1a..cace422 100644 --- a/src/account/api/views.py +++ b/src/account/api/views.py @@ -1,8 +1,8 @@ -from rest_framework.viewsets import GenericViewSet +from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework import mixins from rest_framework.permissions import AllowAny from rest_framework.decorators import action -from account.api.serializers import StudentProfileSerializer, MentorProfileSerializer, UserSerializer +from account.api.serializers import StudentProfileSerializer, MentorProfileSerializer, UserSerializer, MentorsListSerializer from account.models import StudentProfile, MentorProfile from django.contrib.auth.models import User from django.shortcuts import get_object_or_404 @@ -75,3 +75,9 @@ def get(self, request, *args, **kwargs): } status_code = status.HTTP_200_OK if authenticated else status.HTTP_401_UNAUTHORIZED return Response(data, status=status_code) + + +class MentorsListViewSet(ModelViewSet): + serializer_class = MentorsListSerializer + queryset = MentorProfile.objects.all() + permission_classes = [AllowAny, ] From 012f83dc40e6d7d413524b418a712cf107515297 Mon Sep 17 00:00:00 2001 From: karan-modh Date: Tue, 2 Oct 2018 23:24:04 +0530 Subject: [PATCH 2/6] Fixed Build --- src/account/api/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/account/api/views.py b/src/account/api/views.py index cace422..5050257 100644 --- a/src/account/api/views.py +++ b/src/account/api/views.py @@ -2,7 +2,8 @@ from rest_framework import mixins from rest_framework.permissions import AllowAny from rest_framework.decorators import action -from account.api.serializers import StudentProfileSerializer, MentorProfileSerializer, UserSerializer, MentorsListSerializer +from account.api.serializers import StudentProfileSerializer, MentorProfileSerializer +from account.api.serializers import UserSerializer, MentorsListSerializer from account.models import StudentProfile, MentorProfile from django.contrib.auth.models import User from django.shortcuts import get_object_or_404 From fcc1cfa2ee871a15478ff77de871461d889f191c Mon Sep 17 00:00:00 2001 From: karan-modh Date: Wed, 3 Oct 2018 23:39:04 +0530 Subject: [PATCH 3/6] Updated MentorProfileViewSets and Deleted MentorListViewSet --- src/account/api/tests.py | 8 -------- src/account/api/urls.py | 3 +-- src/account/api/views.py | 32 ++++++++++++++++++++++++-------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/account/api/tests.py b/src/account/api/tests.py index 92eada0..0d1d64a 100644 --- a/src/account/api/tests.py +++ b/src/account/api/tests.py @@ -142,11 +142,3 @@ def test_user_with_student_profile(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.content.decode('utf-8'), '{"type":"student-profile","id":%s}' % self.student_profile.id) - - -class MentorsListViewSetTest(TestCase): - - def test_status_OK(self): - response = self.client.get(reverse('api:account:all-mentors-list')) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.content.decode('utf-8'), '[]') diff --git a/src/account/api/urls.py b/src/account/api/urls.py index 39a4f98..9e34389 100644 --- a/src/account/api/urls.py +++ b/src/account/api/urls.py @@ -1,5 +1,5 @@ from rest_framework.routers import DefaultRouter -from account.api.views import StudentProfileViewSet, MentorProfileViewSet, UserViewSet, MentorsListViewSet +from account.api.views import StudentProfileViewSet, MentorProfileViewSet, UserViewSet from .views import AuthenticationCheckAPIView from django.urls import path @@ -8,7 +8,6 @@ router = DefaultRouter() router.register(r'student-profile', StudentProfileViewSet, base_name='student-profile') router.register(r'mentor-profile', MentorProfileViewSet, base_name='mentor-profile') -router.register(r'all-mentors', MentorsListViewSet, base_name='all-mentors') router.register(r'user', UserViewSet, base_name='user') urlpatterns = router.urls + [path('auth-check/', AuthenticationCheckAPIView.as_view(), name='auth-check')] diff --git a/src/account/api/views.py b/src/account/api/views.py index 5050257..df4e4b6 100644 --- a/src/account/api/views.py +++ b/src/account/api/views.py @@ -1,6 +1,6 @@ -from rest_framework.viewsets import GenericViewSet, ModelViewSet +from rest_framework.viewsets import GenericViewSet from rest_framework import mixins -from rest_framework.permissions import AllowAny +from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.decorators import action from account.api.serializers import StudentProfileSerializer, MentorProfileSerializer from account.api.serializers import UserSerializer, MentorsListSerializer @@ -31,6 +31,28 @@ def get_object(self): def current(self, request, *args, **kwargs): return self.retrieve(request, args, kwargs) + # For listing all mentors that are verified + + def get_queryset(self, queryset=None): + return self.queryset.filter(is_approved=True) if self.action == 'all' else super().get_queryset() + + def get_serializer_class(self): + return MentorsListSerializer if self.action == 'all' else self.serializer_class + + def get_permissions(self): + """ + Instantiates and returns the list of permissions that this view requires. + """ + if self.action == 'all': + permission_classes = [AllowAny] + else: + permission_classes = [IsAuthenticated] + return [permission() for permission in permission_classes] + + @action(methods=['get'], detail=False) + def all(self, request, *args, **kwargs): + return self.list(request, args, kwargs) + class UserViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin, GenericViewSet): serializer_class = UserSerializer @@ -76,9 +98,3 @@ def get(self, request, *args, **kwargs): } status_code = status.HTTP_200_OK if authenticated else status.HTTP_401_UNAUTHORIZED return Response(data, status=status_code) - - -class MentorsListViewSet(ModelViewSet): - serializer_class = MentorsListSerializer - queryset = MentorProfile.objects.all() - permission_classes = [AllowAny, ] From d0041eb82a241115123ed0df3261ac441c324823 Mon Sep 17 00:00:00 2001 From: sahil839 Date: Thu, 4 Oct 2018 19:44:03 +0530 Subject: [PATCH 4/6] added page for all mentors --- ui/src/components/MentorDetails.vue | 51 +++++++++++++++++++++++++++++ ui/src/router/index.js | 6 ++-- ui/src/store/modules/app.js | 1 + 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 ui/src/components/MentorDetails.vue diff --git a/ui/src/components/MentorDetails.vue b/ui/src/components/MentorDetails.vue new file mode 100644 index 0000000..bfcc6b8 --- /dev/null +++ b/ui/src/components/MentorDetails.vue @@ -0,0 +1,51 @@ + + + diff --git a/ui/src/router/index.js b/ui/src/router/index.js index 5c8c795..8165953 100644 --- a/ui/src/router/index.js +++ b/ui/src/router/index.js @@ -8,6 +8,7 @@ import HowItWorks from '../components/HowItWorks' import NotFound from '../components/NotFound' import Help from '../components/Help' import Dashboard from '../components/Dashboard' +import MentorDetails from '../components/MentorDetails' Vue.use(Router) @@ -19,9 +20,10 @@ const router = new Router({ {path: '/projects', name: 'Projects', component: ProjectsList}, {path: '/how-it-works', name: 'HowItWorks', component: HowItWorks}, {path: '/help', name: 'Help', component: Help}, + {path: '/mentors', name: 'MentorDetails', component: MentorDetails}, {path: '/dashboard', name: 'Dashboard', component: Dashboard, meta: {requiresAuth: true}}, - { path: '/not-found', component: NotFound }, - { path: '*', redirect: '/not-found' } + {path: '/not-found', component: NotFound}, + {path: '*', redirect: '/not-found'} ] }) diff --git a/ui/src/store/modules/app.js b/ui/src/store/modules/app.js index b8513de..f7619f8 100644 --- a/ui/src/store/modules/app.js +++ b/ui/src/store/modules/app.js @@ -2,6 +2,7 @@ const state = { items: [ {icon: 'fa-home', text: 'Home', path: '/'}, {icon: 'fa-calendar', text: 'How It Works', path: '/how-it-works'}, + {icon: 'supervisor_account', text: 'Mentors', path: '/mentors'}, {icon: 'fa-code', text: 'Projects', path: '/projects'}, {icon: 'fa-tachometer', text: 'Dashboard', path: '/dashboard', requiresAuth: true}, {icon: 'help', text: 'Help', path: '/help'} From ce88c892b93de0deb8383e7ac9daef2b40b0e5b1 Mon Sep 17 00:00:00 2001 From: ajatprabha Date: Thu, 4 Oct 2018 18:43:04 +0530 Subject: [PATCH 5/6] update django --- Pipfile | 2 +- Pipfile.lock | 68 ++++++++++++++++++++++++++-------------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Pipfile b/Pipfile index 46bd483..eb5b446 100644 --- a/Pipfile +++ b/Pipfile @@ -4,7 +4,7 @@ verify_ssl = true name = "pypi" [packages] -django = "==2.1" +django = "==2.1.2" django-decouple = "==2.1" django-cleanup = "==2.1.0" social-auth-app-django = "==2.1.0" diff --git a/Pipfile.lock b/Pipfile.lock index 88f16e5..8b3c2da 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3ef54cb6d9a52b91c971eb7f1ab15ea56ab2788f831bb26eee626fdc8ee6a2e5" + "sha256": "b171f55c137a76c687cee5624bef959d51210e24ed95425a07d10edc6d20b148" }, "pipfile-spec": 6, "requires": { @@ -40,11 +40,11 @@ }, "django": { "hashes": [ - "sha256:7f246078d5a546f63c28fc03ce71f4d7a23677ce42109219c24c9ffb28416137", - "sha256:ea50d85709708621d956187c6b61d9f9ce155007b496dd914fdb35db8d790aec" + "sha256:acdcc1f61fdb0a0c82a1d3bf1879a414e7732ea894a7632af7f6d66ec7ab5bb3", + "sha256:efbcad7ebb47daafbcead109b38a5bd519a3c3cd92c6ed0f691ff97fcdd16b45" ], "index": "pypi", - "version": "==2.1" + "version": "==2.1.2" }, "django-cleanup": { "hashes": [ @@ -266,19 +266,19 @@ }, "coveralls": { "hashes": [ - "sha256:9dee67e78ec17b36c52b778247762851c8e19a893c9a14e921a2fc37f05fac22", - "sha256:aec5a1f5e34224b9089664a1b62217732381c7de361b6ed1b3c394d7187b352a" + "sha256:ab638e88d38916a6cedbf80a9cd8992d5fa55c77ab755e262e00b36792b7cd6d", + "sha256:b2388747e2529fa4c669fb1e3e2756e4e07b6ee56c7d9fce05f35ccccc913aa0" ], "index": "pypi", - "version": "==1.5.0" + "version": "==1.5.1" }, "django": { "hashes": [ - "sha256:7f246078d5a546f63c28fc03ce71f4d7a23677ce42109219c24c9ffb28416137", - "sha256:ea50d85709708621d956187c6b61d9f9ce155007b496dd914fdb35db8d790aec" + "sha256:acdcc1f61fdb0a0c82a1d3bf1879a414e7732ea894a7632af7f6d66ec7ab5bb3", + "sha256:efbcad7ebb47daafbcead109b38a5bd519a3c3cd92c6ed0f691ff97fcdd16b45" ], "index": "pypi", - "version": "==2.1" + "version": "==2.1.2" }, "djangorestframework": { "hashes": [ @@ -425,30 +425,30 @@ }, "ruamel.yaml": { "hashes": [ - "sha256:04a1f3159a1f850113054d88b5ee30231b02579ababdb59347a732152389aaec", - "sha256:117f2da270f4c49066006a130e8e73939f57923ee1fd329cadb528b20bd8477f", - "sha256:1fb81311547b7cdfa510c546deb704d2028b844591aaf044603626189a1632e9", - "sha256:36c3e75a1052fdc5c5663dc895f7bac435506c5c483fcaeec0d0ebf782885a04", - "sha256:463c84af7894986c27a63ea499c399d8c88d0d2cc360e8f62d64f98d3386de38", - "sha256:489de342de4a4dac05e1da335d676a4c57cceaed37d4597c46db5b837a15167c", - "sha256:63e83d299394e9dda8bb410120aaf39b3c880ed16405a3d3c35e69b9aa7fe783", - "sha256:6d4f8d638c993c252cd124059619c8cdfff547d64e0416cae640ea1af974671a", - "sha256:7ed0044eed6ea4545f72946fb138942b885af694661199954428f75d0c82bc4b", - "sha256:8cffcf0c646fc660459b9e0e603682f2975def5cf7cae6e4eaded0ae563c1cd8", - "sha256:96532069662190a892905baab75e3a7896de4306de718915d0d9cc0b5c01e466", - "sha256:98af86ef66d27a195d231606c46155b3798fd7997f282883a0e62285dc71fba6", - "sha256:9f9f6ac14e5f5fb05c18db8eca8a4fdbb79411e1456c5bc84efe5cc3af00bdf0", - "sha256:a53b083fbb848846f9ceed530ca3eb67eba4478ae28075e7e86aa67b3431bcc7", - "sha256:b5d45851919402108792ca6ac1988990f2ccdfbf14606df5820e4520b1475666", - "sha256:b9f206c42aea09027d2ecd884d459b3a48bd1730909d36ce40270bb43aebb1aa", - "sha256:bb1a93632a8f3b977be02dacdb5bbab34a0ed7fca329d4056b58420b76ea06ae", - "sha256:bc1b9e377c34282e37f5ea1b421118ef60c7d64631d6dc461889ff74744310b3", - "sha256:ccded40ee652c640b7833c913c6f3ea5a1ba21e3c774bf2174fc8bd12ab49642", - "sha256:d05893b2544be48d4dda2aa1274acc9997a15f6a6d8e1a16e39d110c7908cbb0", - "sha256:d7b568971effc37b1a883fb819108ccea9526b19a322dc33390c0d3afd4cda6d", - "sha256:e3959dd5df95456091dfff9ded1319d10b887ae4d05fe9198c3f5f4a72913cdc" - ], - "version": "==0.15.69" + "sha256:0dc040e569fae5c1ba3f2dfb36194b13806fff7ae4bd0d8aa27acebeca5b6248", + "sha256:26fcf3e09e23d6a75f424a6c90ae736d0e865009f5d46f49f44c2a6b9deb1368", + "sha256:342d1c23e593cf4fcc1a62a6e0f0e42915cbab29c2c805198bb20186a6fbfd42", + "sha256:3988638a58a370c61657b8b4cb0d5e2460aeeeb1086b4cd33b8ee8cdbb8f76fa", + "sha256:61427694d0698cbb26f1fd291cf77a9e7c25173793794cb56da0afc92adf7e85", + "sha256:626193e2d71243e19c05d50e8f6f9248d3469e55c180640f9055a4356a3349b4", + "sha256:7884fb4bb004d069e54ec759ae95d58eb5ab8d826e2f1912f82652379b8e29a8", + "sha256:82dcdc0258f09ef9a11403c7cd8a58f8f6630f6e5b63146626baeb134e1f197c", + "sha256:9b1b3e78dee30a2fcad01be63990702ddfeeba77b80215441c2940e762c46e35", + "sha256:a172db832921d4e9f19df416029454a917b784c3a9f03d4d94d49caf5c9525ec", + "sha256:a1e35eff0e89f379dd737750853d5780a0deff9a5702659c48d3ff81366cfde3", + "sha256:a85fba19af68b5ee547c8619c3c82a31f4de12255a194b0bf51948028339258d", + "sha256:a8ea051a1f6fe0184d86020fe8e873823f2555d28b9114e6b580fc5282fedf1a", + "sha256:ae4c40b406e64ef9e168bfe44a2476671795f750ac2feba82fb21756fb76bc9b", + "sha256:b0a3f5c589e6a61d9d36678cfc0b329b93e9425d215a442a44f35f401d1e15b2", + "sha256:be4697f74edd665169282953b8f2a8cc08426c15a72095eb7fef094390f28128", + "sha256:dc3c1bc500af8d088cff3282531aab1f09f058daa349918ef02d2667ca0ba468", + "sha256:e548fc78c2044b057393c70220bd2fc2393f680fe5c87bb5cce8e7c51e256d91", + "sha256:e736199b5d9ff3702b796d61fe012ba0b284534b4a8dd50a14966b42fcdf0b68", + "sha256:f04f2e305450c39ab5f075959d8cc8c5f1a800a7088ab05e80306ac4092b7e3b", + "sha256:f25b53a3d0454330ca9794980a71cfeabb2eae096057ebdd7e0275947067dd75", + "sha256:fd9cb99b56a89e658a377ec706a8bbcca82358fbeb03c42d4608ec27f7c82b8c" + ], + "version": "==0.15.71" }, "six": { "hashes": [ From d71aa27a232e43d711281c2c880680f268c4c840 Mon Sep 17 00:00:00 2001 From: ajatprabha Date: Thu, 4 Oct 2018 18:48:53 +0530 Subject: [PATCH 6/6] update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dd3765f..e55644f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# WoC ![Status active](https://img.shields.io/badge/Status-active%20development-2eb3c1.svg) ![Django 2.1](https://img.shields.io/badge/Django-2.1-green.svg) ![Python 3.6](https://img.shields.io/badge/Python-3.6-blue.svg) +# WoC ![Status active](https://img.shields.io/badge/Status-active%20development-2eb3c1.svg) ![Django 2.1.2](https://img.shields.io/badge/Django-2.1.2-green.svg) ![Python 3.6](https://img.shields.io/badge/Python-3.6-blue.svg) [![Build Status](https://travis-ci.org/devlup-labs/woc.svg?branch=master)](https://travis-ci.org/devlup-labs/woc) [![Coverage Status](https://coveralls.io/repos/github/devlup-labs/woc/badge.svg?branch=master)](https://coveralls.io/github/devlup-labs/woc?branch=master) ## Main website for Winter Of Code Projects ### Installation: Requirements: - Python 3.6 runtime -- Django 2.1 +- Django 2.1.2 - Other dependencies in `Pipfile` > For Vuetify UI build steps, follow [this](ui/README.md)