From b0bdd8627b39c0c08d54cd7028870cac4439ad9e Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Sat, 28 Dec 2019 12:27:27 -0800 Subject: [PATCH 01/15] Setup Project Model --- projectsplatform/settings.py | 1 + scprojects/__init__.py | 0 scprojects/admin.py | 3 ++ scprojects/apps.py | 5 ++++ scprojects/migrations/0001_initial.py | 41 +++++++++++++++++++++++++++ scprojects/migrations/__init__.py | 0 scprojects/models.py | 22 ++++++++++++++ scprojects/tests.py | 3 ++ scprojects/views.py | 3 ++ 9 files changed, 78 insertions(+) create mode 100644 scprojects/__init__.py create mode 100644 scprojects/admin.py create mode 100644 scprojects/apps.py create mode 100644 scprojects/migrations/0001_initial.py create mode 100644 scprojects/migrations/__init__.py create mode 100644 scprojects/models.py create mode 100644 scprojects/tests.py create mode 100644 scprojects/views.py diff --git a/projectsplatform/settings.py b/projectsplatform/settings.py index f120751..acd15eb 100644 --- a/projectsplatform/settings.py +++ b/projectsplatform/settings.py @@ -36,6 +36,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'scprojects' ] MIDDLEWARE = [ diff --git a/scprojects/__init__.py b/scprojects/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scprojects/admin.py b/scprojects/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/scprojects/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/scprojects/apps.py b/scprojects/apps.py new file mode 100644 index 0000000..1a69a5e --- /dev/null +++ b/scprojects/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ScprojectsConfig(AppConfig): + name = 'scprojects' diff --git a/scprojects/migrations/0001_initial.py b/scprojects/migrations/0001_initial.py new file mode 100644 index 0000000..5660479 --- /dev/null +++ b/scprojects/migrations/0001_initial.py @@ -0,0 +1,41 @@ +# Generated by Django 2.2.6 on 2019-12-28 20:25 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('github_url', models.URLField(blank=True, max_length=255)), + ('description', models.TextField()), + ('looking_for', models.TextField()), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('contributors', models.ManyToManyField(to=settings.AUTH_USER_MODEL)), + ('lead', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='leads', to=settings.AUTH_USER_MODEL)), + ('tech_stack', models.ManyToManyField(to='scprojects.Tag')), + ], + ), + ] diff --git a/scprojects/migrations/__init__.py b/scprojects/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scprojects/models.py b/scprojects/models.py new file mode 100644 index 0000000..a73313e --- /dev/null +++ b/scprojects/models.py @@ -0,0 +1,22 @@ +from django.db import models +from django.contrib.auth.models import User +# Create your models here. + + +class Tag(models.Model): + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + name = models.CharField(max_length=255) + +class Project(models.Model): + name = models.CharField(max_length=255) + github_url = models.URLField(max_length=255, blank=True) + lead = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="leads") + description = models.TextField() + looking_for = models.TextField() + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + tech_stack = models.ManyToManyField(Tag) + contributors = models.ManyToManyField(User) + + diff --git a/scprojects/tests.py b/scprojects/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/scprojects/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/scprojects/views.py b/scprojects/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/scprojects/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From f9e0d5400d91b742e9dca494f4a0bc1ac6777aca Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Fri, 10 Jan 2020 09:50:00 -0800 Subject: [PATCH 02/15] URL patterns --- projectsplatform/urls.py | 5 ++++- scprojects/urls.py | 6 ++++++ scprojects/views.py | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 scprojects/urls.py diff --git a/projectsplatform/urls.py b/projectsplatform/urls.py index 339d73a..b164e72 100644 --- a/projectsplatform/urls.py +++ b/projectsplatform/urls.py @@ -14,8 +14,11 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import include, path +from scprojects import views urlpatterns = [ + path('scprojects/', include('scprojects.urls')), path('admin/', admin.site.urls), + path('', views.index, name='index') ] diff --git a/scprojects/urls.py b/scprojects/urls.py new file mode 100644 index 0000000..6e21aeb --- /dev/null +++ b/scprojects/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.index, name='index'), +] diff --git a/scprojects/views.py b/scprojects/views.py index 91ea44a..bbe73cf 100644 --- a/scprojects/views.py +++ b/scprojects/views.py @@ -1,3 +1,5 @@ from django.shortcuts import render +from django.http import HttpResponse -# Create your views here. +def index(request): + return HttpResponse("Hello, world. You're at the polls index.") From 1793cd97d5c94082b2e0923f8aa310d643c3233d Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 13 Jan 2020 08:51:24 -0800 Subject: [PATCH 03/15] Removed --- scprojects/models.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scprojects/models.py b/scprojects/models.py index a73313e..cee2f6c 100644 --- a/scprojects/models.py +++ b/scprojects/models.py @@ -2,12 +2,6 @@ from django.contrib.auth.models import User # Create your models here. - -class Tag(models.Model): - created = models.DateTimeField(auto_now_add=True) - updated = models.DateTimeField(auto_now=True) - name = models.CharField(max_length=255) - class Project(models.Model): name = models.CharField(max_length=255) github_url = models.URLField(max_length=255, blank=True) @@ -16,7 +10,6 @@ class Project(models.Model): looking_for = models.TextField() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - tech_stack = models.ManyToManyField(Tag) contributors = models.ManyToManyField(User) From c7da11ddf6a408d0ead212c70349c0bac57c092a Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 13 Jan 2020 08:54:26 -0800 Subject: [PATCH 04/15] Add projects to URL --- projectsplatform/urls.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projectsplatform/urls.py b/projectsplatform/urls.py index b164e72..c896293 100644 --- a/projectsplatform/urls.py +++ b/projectsplatform/urls.py @@ -20,5 +20,7 @@ urlpatterns = [ path('scprojects/', include('scprojects.urls')), path('admin/', admin.site.urls), - path('', views.index, name='index') + path('', views.index, name='index'), + path('projects/', views.projects, name='projects'), + ] From a7a3992d01052510b48f0627556e402c5777fd5e Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 13 Jan 2020 10:16:31 -0800 Subject: [PATCH 05/15] Added project to Admin panel --- scprojects/admin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scprojects/admin.py b/scprojects/admin.py index 8c38f3f..6086829 100644 --- a/scprojects/admin.py +++ b/scprojects/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from .models import Project + +admin.site.register(Project) # Register your models here. From 150a489718d66560f7e4f5b2dc3e4b827d944cd8 Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 13 Jan 2020 10:16:40 -0800 Subject: [PATCH 06/15] Removed tags --- .../migrations/0002_auto_20200113_1700.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 scprojects/migrations/0002_auto_20200113_1700.py diff --git a/scprojects/migrations/0002_auto_20200113_1700.py b/scprojects/migrations/0002_auto_20200113_1700.py new file mode 100644 index 0000000..2e06ea0 --- /dev/null +++ b/scprojects/migrations/0002_auto_20200113_1700.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.6 on 2020-01-13 17:00 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='tech_stack', + ), + migrations.DeleteModel( + name='Tag', + ), + ] From aea8fbcec180bf96edadae07bbaaa9f2ed833f18 Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 13 Jan 2020 10:17:05 -0800 Subject: [PATCH 07/15] Easier to read project data set --- scprojects/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scprojects/models.py b/scprojects/models.py index cee2f6c..7c16584 100644 --- a/scprojects/models.py +++ b/scprojects/models.py @@ -12,4 +12,7 @@ class Project(models.Model): updated = models.DateTimeField(auto_now=True) contributors = models.ManyToManyField(User) + def __str__(self): + return self.name + From 4a1c5245e2a088ac19bb43ffc61f3e8b13fc9040 Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 13 Jan 2020 10:17:20 -0800 Subject: [PATCH 08/15] First draft Project API --- scprojects/views.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scprojects/views.py b/scprojects/views.py index bbe73cf..794e2a1 100644 --- a/scprojects/views.py +++ b/scprojects/views.py @@ -1,5 +1,19 @@ from django.shortcuts import render from django.http import HttpResponse +from .models import Project +from django.core import serializers def index(request): return HttpResponse("Hello, world. You're at the polls index.") + + +def projects(request): + projects = Project.objects.all() + data = serializers.serialize("json", projects) + return HttpResponse(data) + + +# next up TODO's +# add project +# add user +# login From a092c2ab9e7d05cd76c4031668fe0401cd8f29cf Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 20 Jan 2020 09:04:17 -0800 Subject: [PATCH 09/15] Github auth setup --- .gitignore | 3 +++ projectsplatform/secrets.example.py | 30 ++++++++++++++++++++++++ projectsplatform/settings.py | 36 ++++++++++++++--------------- projectsplatform/urls.py | 4 ++-- 4 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 projectsplatform/secrets.example.py diff --git a/.gitignore b/.gitignore index 02f08e4..cecf253 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,6 @@ venv.bak/ # vscode configs .vscode + +# secrets +projectsplatform/secrets.py diff --git a/projectsplatform/secrets.example.py b/projectsplatform/secrets.example.py new file mode 100644 index 0000000..191bc73 --- /dev/null +++ b/projectsplatform/secrets.example.py @@ -0,0 +1,30 @@ +# SECURITY WARNING: don't run with debug turned on in production! +SECRET_KEY = '' + +# Database +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': '', + 'USER': '', + 'PASSWORD': '', + 'HOST': 'localhost', + 'PORT': '5432', + } +} + + +# Provider specific settings +SITE_ID = 2 +SOCIALACCOUNT_PROVIDERS = { + 'github': { + # todo: do not commit this to github + 'APP': { + 'client_id': '', + 'secret': '', + 'key': '' + } + } +} diff --git a/projectsplatform/settings.py b/projectsplatform/settings.py index acd15eb..8f12e28 100644 --- a/projectsplatform/settings.py +++ b/projectsplatform/settings.py @@ -11,6 +11,7 @@ """ import os +from .secrets import * # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -20,8 +21,6 @@ # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ -# SECURITY WARNING: don't run with debug turned on in production! -SECRET_KEY = 'dulwepf_b#@eh19w)==v+pxvw$u$2gbxpwoevmzg)h-pl1mded' DEBUG = True ALLOWED_HOSTS = [] @@ -36,9 +35,15 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'scprojects' + 'django.contrib.sites', + 'scprojects', + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'allauth.socialaccount.providers.github', ] + MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -62,6 +67,8 @@ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + # `allauth` needs this from django + 'django.template.context_processors.request', ], }, }, @@ -70,21 +77,6 @@ WSGI_APPLICATION = 'projectsplatform.wsgi.application' -# Database -# https://docs.djangoproject.com/en/2.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': 'scprojects', - 'USER': 'scadmin', - 'PASSWORD': '', - 'HOST': 'localhost', - 'PORT': '5432', - } -} - - # Password validation # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators @@ -122,3 +114,11 @@ # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' + +AUTHENTICATION_BACKENDS = ( + # Needed to login by username in Django admin, regardless of `allauth` + 'django.contrib.auth.backends.ModelBackend', + + # `allauth` specific authentication methods, such as login by e-mail + 'allauth.account.auth_backends.AuthenticationBackend', +) diff --git a/projectsplatform/urls.py b/projectsplatform/urls.py index c896293..8f52ba9 100644 --- a/projectsplatform/urls.py +++ b/projectsplatform/urls.py @@ -14,7 +14,7 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import include, path +from django.urls import include, path, re_path from scprojects import views urlpatterns = [ @@ -22,5 +22,5 @@ path('admin/', admin.site.urls), path('', views.index, name='index'), path('projects/', views.projects, name='projects'), - + re_path(r'^accounts/', include('allauth.urls')), ] From fed216ac1d1f01425ce45f8efd4e6d89f219645c Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 20 Jan 2020 10:16:00 -0800 Subject: [PATCH 10/15] Github auth: redirect, check auth & logout --- projectsplatform/settings.py | 3 +++ projectsplatform/urls.py | 3 +-- scprojects/models.py | 16 ++++++++++++++-- scprojects/urls.py | 2 ++ scprojects/views.py | 25 ++++++++++++++++++------- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/projectsplatform/settings.py b/projectsplatform/settings.py index 8f12e28..1381c5c 100644 --- a/projectsplatform/settings.py +++ b/projectsplatform/settings.py @@ -122,3 +122,6 @@ # `allauth` specific authentication methods, such as login by e-mail 'allauth.account.auth_backends.AuthenticationBackend', ) + +ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = None +LOGIN_REDIRECT_URL = FRONTEND_DOMAIN_NAME diff --git a/projectsplatform/urls.py b/projectsplatform/urls.py index 8f52ba9..4f01a4f 100644 --- a/projectsplatform/urls.py +++ b/projectsplatform/urls.py @@ -18,9 +18,8 @@ from scprojects import views urlpatterns = [ - path('scprojects/', include('scprojects.urls')), + path('projects/', include('scprojects.urls')), path('admin/', admin.site.urls), path('', views.index, name='index'), - path('projects/', views.projects, name='projects'), re_path(r'^accounts/', include('allauth.urls')), ] diff --git a/scprojects/models.py b/scprojects/models.py index 7c16584..9047d7f 100644 --- a/scprojects/models.py +++ b/scprojects/models.py @@ -2,10 +2,12 @@ from django.contrib.auth.models import User # Create your models here. + class Project(models.Model): name = models.CharField(max_length=255) github_url = models.URLField(max_length=255, blank=True) - lead = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="leads") + lead = models.ForeignKey( + User, on_delete=models.SET_NULL, null=True, related_name="leads") description = models.TextField() looking_for = models.TextField() created = models.DateTimeField(auto_now_add=True) @@ -15,4 +17,14 @@ class Project(models.Model): def __str__(self): return self.name - + def __dict__(self): + return { + "name": self.name, + "github_url": self.github_url, + # "lead": self.lead, + "description": self.description, + "looking_for": self.looking_for, + "created": self.created, + "updated": self.updated, + # "contributors": self.contributors, + } diff --git a/scprojects/urls.py b/scprojects/urls.py index 6e21aeb..dc5b25b 100644 --- a/scprojects/urls.py +++ b/scprojects/urls.py @@ -3,4 +3,6 @@ urlpatterns = [ path('', views.index, name='index'), + path('all/', views.projects, name='projects'), + path('logout/', views.logout, name='logout'), ] diff --git a/scprojects/views.py b/scprojects/views.py index 794e2a1..4170c62 100644 --- a/scprojects/views.py +++ b/scprojects/views.py @@ -1,7 +1,10 @@ from django.shortcuts import render from django.http import HttpResponse from .models import Project -from django.core import serializers +from django.contrib.auth.models import User +from django.contrib.auth import logout as django_logout +from django.http import JsonResponse + def index(request): return HttpResponse("Hello, world. You're at the polls index.") @@ -9,11 +12,19 @@ def index(request): def projects(request): projects = Project.objects.all() - data = serializers.serialize("json", projects) - return HttpResponse(data) + response = {} + response["user"] = { + "username": request.user.username, + "is_authenticated": request.user.is_authenticated, + } + response["projects"] = [] + for project in list(projects): + json_obj = project.__dict__() + response["projects"].append(json_obj) + + return JsonResponse(response) -# next up TODO's -# add project -# add user -# login +def logout(request): + django_logout(request) + return JsonResponse({"status": "success"}) From 4f9ce810bb21f5ce59bf22b7783890655411d289 Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 20 Jan 2020 12:50:19 -0800 Subject: [PATCH 11/15] Setup for CORS and Session Cookies --- projectsplatform/settings.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/projectsplatform/settings.py b/projectsplatform/settings.py index 1381c5c..a32fe35 100644 --- a/projectsplatform/settings.py +++ b/projectsplatform/settings.py @@ -35,15 +35,23 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'corsheaders', 'django.contrib.sites', 'scprojects', 'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth.socialaccount.providers.github', + ] +CORS_ALLOW_CREDENTIALS = True +CORS_ORIGIN_WHITELIST = [ + "http://localhost:3000", +] +SESSION_COOKIE_SAMESITE = None +CRSF_COOKIE_SAMESITE = None MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -52,6 +60,8 @@ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.common.CommonMiddleware', ] ROOT_URLCONF = 'projectsplatform.urls' From 8bc25df8b325d8dcf6b94d266671438cc8767241 Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 20 Jan 2020 12:50:30 -0800 Subject: [PATCH 12/15] Update models --- scprojects/models.py | 1 + scprojects/views.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scprojects/models.py b/scprojects/models.py index 9047d7f..1ae2be7 100644 --- a/scprojects/models.py +++ b/scprojects/models.py @@ -19,6 +19,7 @@ def __str__(self): def __dict__(self): return { + "id": self.id, "name": self.name, "github_url": self.github_url, # "lead": self.lead, diff --git a/scprojects/views.py b/scprojects/views.py index 4170c62..ee917a1 100644 --- a/scprojects/views.py +++ b/scprojects/views.py @@ -14,7 +14,7 @@ def projects(request): projects = Project.objects.all() response = {} response["user"] = { - "username": request.user.username, + "name": request.user.username, "is_authenticated": request.user.is_authenticated, } response["projects"] = [] From 8933667ea76f4e0d38dec67664d7497e97662588 Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Mon, 20 Jan 2020 14:33:43 -0800 Subject: [PATCH 13/15] UserProfile model --- scprojects/admin.py | 3 ++- scprojects/migrations/0003_userprofile.py | 32 +++++++++++++++++++++++ scprojects/models.py | 14 ++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 scprojects/migrations/0003_userprofile.py diff --git a/scprojects/admin.py b/scprojects/admin.py index 6086829..1905f65 100644 --- a/scprojects/admin.py +++ b/scprojects/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin -from .models import Project +from .models import Project, UserProfile admin.site.register(Project) +admin.site.register(UserProfile) # Register your models here. diff --git a/scprojects/migrations/0003_userprofile.py b/scprojects/migrations/0003_userprofile.py new file mode 100644 index 0000000..e43fe97 --- /dev/null +++ b/scprojects/migrations/0003_userprofile.py @@ -0,0 +1,32 @@ +# Generated by Django 2.2.6 on 2020-01-20 22:27 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('scprojects', '0002_auto_20200113_1700'), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('department', models.CharField(max_length=100)), + ('experience_lvl', models.PositiveSmallIntegerField()), + ('position', models.CharField(max_length=255)), + ('is_active', models.BooleanField()), + ('github_username', models.CharField(max_length=255)), + ('github_id', models.PositiveIntegerField()), + ('github_url', models.URLField(blank=True, max_length=255)), + ('avatar_url', models.URLField(blank=True, max_length=255)), + ('gravatar_url', models.URLField(blank=True, max_length=255)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/scprojects/models.py b/scprojects/models.py index 1ae2be7..d7a54ea 100644 --- a/scprojects/models.py +++ b/scprojects/models.py @@ -3,6 +3,20 @@ # Create your models here. +class UserProfile(models.Model): + # TODO: figure out which ones are required fields + user = models.OneToOneField(User, on_delete=models.CASCADE) + department = models.CharField(max_length=100) + experience_lvl = models.PositiveSmallIntegerField() + position = models.CharField(max_length=255) + is_active = models.BooleanField() + github_username = models.CharField(max_length=255) + github_id = models.PositiveIntegerField() + github_url = models.URLField(max_length=255, blank=True) + avatar_url = models.URLField(max_length=255, blank=True) + gravatar_url = models.URLField(max_length=255, blank=True) + + class Project(models.Model): name = models.CharField(max_length=255) github_url = models.URLField(max_length=255, blank=True) From 8ad9d31069b02d9fbdbc899c40ad414ce46f753d Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Thu, 23 Jan 2020 00:01:26 -0800 Subject: [PATCH 14/15] Getting UserProfile created upon Github authentication --- projectsplatform/settings.py | 2 +- scprojects/apps.py | 3 ++ .../migrations/0004_auto_20200123_0453.py | 28 +++++++++++++++ .../0005_remove_userprofile_department.py | 17 +++++++++ .../migrations/0006_auto_20200123_0707.py | 19 ++++++++++ .../migrations/0007_auto_20200123_0708.py | 20 +++++++++++ .../migrations/0008_auto_20200123_0715.py | 19 ++++++++++ .../0009_remove_project_contributors.py | 17 +++++++++ .../migrations/0010_remove_project_lead.py | 17 +++++++++ scprojects/migrations/0011_project_lead.py | 19 ++++++++++ .../migrations/0012_remove_project_lead.py | 17 +++++++++ scprojects/migrations/0013_project_lead.py | 19 ++++++++++ .../migrations/0014_remove_project_lead.py | 17 +++++++++ scprojects/migrations/0015_project_lead.py | 19 ++++++++++ scprojects/models.py | 27 ++++++++------ scprojects/signals.py | 36 +++++++++++++++++++ scprojects/views.py | 4 +-- 17 files changed, 287 insertions(+), 13 deletions(-) create mode 100644 scprojects/migrations/0004_auto_20200123_0453.py create mode 100644 scprojects/migrations/0005_remove_userprofile_department.py create mode 100644 scprojects/migrations/0006_auto_20200123_0707.py create mode 100644 scprojects/migrations/0007_auto_20200123_0708.py create mode 100644 scprojects/migrations/0008_auto_20200123_0715.py create mode 100644 scprojects/migrations/0009_remove_project_contributors.py create mode 100644 scprojects/migrations/0010_remove_project_lead.py create mode 100644 scprojects/migrations/0011_project_lead.py create mode 100644 scprojects/migrations/0012_remove_project_lead.py create mode 100644 scprojects/migrations/0013_project_lead.py create mode 100644 scprojects/migrations/0014_remove_project_lead.py create mode 100644 scprojects/migrations/0015_project_lead.py create mode 100644 scprojects/signals.py diff --git a/projectsplatform/settings.py b/projectsplatform/settings.py index a32fe35..29dbf16 100644 --- a/projectsplatform/settings.py +++ b/projectsplatform/settings.py @@ -37,7 +37,7 @@ 'django.contrib.staticfiles', 'corsheaders', 'django.contrib.sites', - 'scprojects', + 'scprojects.apps.ScprojectsConfig', 'allauth', 'allauth.account', 'allauth.socialaccount', diff --git a/scprojects/apps.py b/scprojects/apps.py index 1a69a5e..7db5ff9 100644 --- a/scprojects/apps.py +++ b/scprojects/apps.py @@ -3,3 +3,6 @@ class ScprojectsConfig(AppConfig): name = 'scprojects' + + def ready(self): + import scprojects.signals diff --git a/scprojects/migrations/0004_auto_20200123_0453.py b/scprojects/migrations/0004_auto_20200123_0453.py new file mode 100644 index 0000000..08816b9 --- /dev/null +++ b/scprojects/migrations/0004_auto_20200123_0453.py @@ -0,0 +1,28 @@ +# Generated by Django 2.2.6 on 2020-01-23 04:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0003_userprofile'), + ] + + operations = [ + migrations.AlterField( + model_name='userprofile', + name='avatar_url', + field=models.URLField(max_length=255), + ), + migrations.AlterField( + model_name='userprofile', + name='github_url', + field=models.URLField(max_length=255), + ), + migrations.AlterField( + model_name='userprofile', + name='gravatar_url', + field=models.URLField(max_length=255), + ), + ] diff --git a/scprojects/migrations/0005_remove_userprofile_department.py b/scprojects/migrations/0005_remove_userprofile_department.py new file mode 100644 index 0000000..65f1d20 --- /dev/null +++ b/scprojects/migrations/0005_remove_userprofile_department.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.6 on 2020-01-23 06:58 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0004_auto_20200123_0453'), + ] + + operations = [ + migrations.RemoveField( + model_name='userprofile', + name='department', + ), + ] diff --git a/scprojects/migrations/0006_auto_20200123_0707.py b/scprojects/migrations/0006_auto_20200123_0707.py new file mode 100644 index 0000000..dc381e7 --- /dev/null +++ b/scprojects/migrations/0006_auto_20200123_0707.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0005_remove_userprofile_department'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='lead', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='leads', to='scprojects.UserProfile'), + ), + ] diff --git a/scprojects/migrations/0007_auto_20200123_0708.py b/scprojects/migrations/0007_auto_20200123_0708.py new file mode 100644 index 0000000..0023c08 --- /dev/null +++ b/scprojects/migrations/0007_auto_20200123_0708.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:08 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0006_auto_20200123_0707'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='lead', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='leads', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/scprojects/migrations/0008_auto_20200123_0715.py b/scprojects/migrations/0008_auto_20200123_0715.py new file mode 100644 index 0000000..a3581cf --- /dev/null +++ b/scprojects/migrations/0008_auto_20200123_0715.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:15 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0007_auto_20200123_0708'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='lead', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='leads', to='scprojects.UserProfile'), + ), + ] diff --git a/scprojects/migrations/0009_remove_project_contributors.py b/scprojects/migrations/0009_remove_project_contributors.py new file mode 100644 index 0000000..aabb094 --- /dev/null +++ b/scprojects/migrations/0009_remove_project_contributors.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:22 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0008_auto_20200123_0715'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='contributors', + ), + ] diff --git a/scprojects/migrations/0010_remove_project_lead.py b/scprojects/migrations/0010_remove_project_lead.py new file mode 100644 index 0000000..70ab63a --- /dev/null +++ b/scprojects/migrations/0010_remove_project_lead.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:26 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0009_remove_project_contributors'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='lead', + ), + ] diff --git a/scprojects/migrations/0011_project_lead.py b/scprojects/migrations/0011_project_lead.py new file mode 100644 index 0000000..5f05988 --- /dev/null +++ b/scprojects/migrations/0011_project_lead.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0010_remove_project_lead'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='lead', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='leads', to='scprojects.UserProfile'), + ), + ] diff --git a/scprojects/migrations/0012_remove_project_lead.py b/scprojects/migrations/0012_remove_project_lead.py new file mode 100644 index 0000000..af5ce7f --- /dev/null +++ b/scprojects/migrations/0012_remove_project_lead.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:29 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0011_project_lead'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='lead', + ), + ] diff --git a/scprojects/migrations/0013_project_lead.py b/scprojects/migrations/0013_project_lead.py new file mode 100644 index 0000000..efa7187 --- /dev/null +++ b/scprojects/migrations/0013_project_lead.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:36 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0012_remove_project_lead'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='lead', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='leads', to='scprojects.UserProfile'), + ), + ] diff --git a/scprojects/migrations/0014_remove_project_lead.py b/scprojects/migrations/0014_remove_project_lead.py new file mode 100644 index 0000000..8a6342b --- /dev/null +++ b/scprojects/migrations/0014_remove_project_lead.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0013_project_lead'), + ] + + operations = [ + migrations.RemoveField( + model_name='project', + name='lead', + ), + ] diff --git a/scprojects/migrations/0015_project_lead.py b/scprojects/migrations/0015_project_lead.py new file mode 100644 index 0000000..e01999d --- /dev/null +++ b/scprojects/migrations/0015_project_lead.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.6 on 2020-01-23 07:37 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('scprojects', '0014_remove_project_lead'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='lead', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='leads', to='scprojects.UserProfile'), + ), + ] diff --git a/scprojects/models.py b/scprojects/models.py index d7a54ea..3b69f1b 100644 --- a/scprojects/models.py +++ b/scprojects/models.py @@ -1,42 +1,49 @@ from django.db import models from django.contrib.auth.models import User +# from .models import UserProfile # Create your models here. class UserProfile(models.Model): - # TODO: figure out which ones are required fields user = models.OneToOneField(User, on_delete=models.CASCADE) - department = models.CharField(max_length=100) experience_lvl = models.PositiveSmallIntegerField() position = models.CharField(max_length=255) is_active = models.BooleanField() github_username = models.CharField(max_length=255) github_id = models.PositiveIntegerField() - github_url = models.URLField(max_length=255, blank=True) - avatar_url = models.URLField(max_length=255, blank=True) - gravatar_url = models.URLField(max_length=255, blank=True) + github_url = models.URLField(max_length=255) + avatar_url = models.URLField(max_length=255) + gravatar_url = models.URLField(max_length=255) class Project(models.Model): name = models.CharField(max_length=255) github_url = models.URLField(max_length=255, blank=True) - lead = models.ForeignKey( - User, on_delete=models.SET_NULL, null=True, related_name="leads") description = models.TextField() looking_for = models.TextField() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - contributors = models.ManyToManyField(User) + # get lead info bundle + lead = models.ForeignKey( + UserProfile, on_delete=models.SET_NULL, null=True, related_name="leads") + + # contributors = models.ManyToManyField(User) def __str__(self): return self.name - def __dict__(self): + def dict_format(self): + print(self.lead) + lead_obj = {} + lead_obj["name"] = self.lead.user.first_name + \ + ' ' + self.lead.user.last_name + lead_obj["position"] = self.lead.position + lead_obj["experience"] = self.lead.experience_lvl return { "id": self.id, "name": self.name, "github_url": self.github_url, - # "lead": self.lead, + "lead": lead_obj, "description": self.description, "looking_for": self.looking_for, "created": self.created, diff --git a/scprojects/signals.py b/scprojects/signals.py new file mode 100644 index 0000000..68eec27 --- /dev/null +++ b/scprojects/signals.py @@ -0,0 +1,36 @@ +from django.db.models.signals import pre_save +from django.dispatch import receiver +from allauth.socialaccount.models import SocialAccount +from allauth.account.signals import user_logged_in +from django.core.signals import request_finished +from .models import UserProfile + +# request_finished.connect( +# "http://127.0.0.1:8000/accounts/github/login/callback") +# ljsadkjdljs + + +@receiver(user_logged_in) +def retrieve_social_data(request, user, **kwargs): + print("hello xxx") + data = SocialAccount.objects.filter( + user=user, provider='github')[0].extra_data + print(data) + + try: + newUser = UserProfile.objects.get(user=user) + print("User Profile", newUser) + except UserProfile.DoesNotExist: + print("Does not exists, creating new") + newUser = UserProfile( + user=user, + experience_lvl=0, + position=data["company"], + is_active=True, + github_username=data["login"], + github_id=data["id"], + github_url=data["html_url"], + avatar_url=data["avatar_url"], + gravatar_url=data["gravatar_id"] + ) + newUser.save() diff --git a/scprojects/views.py b/scprojects/views.py index ee917a1..609f94e 100644 --- a/scprojects/views.py +++ b/scprojects/views.py @@ -19,7 +19,7 @@ def projects(request): } response["projects"] = [] for project in list(projects): - json_obj = project.__dict__() + json_obj = project.dict_format() response["projects"].append(json_obj) return JsonResponse(response) @@ -27,4 +27,4 @@ def projects(request): def logout(request): django_logout(request) - return JsonResponse({"status": "success"}) + return JsonResponse({"status": "logout success"}) From 9713a36d705d53fca302055e8639f93f5fa9b21c Mon Sep 17 00:00:00 2001 From: Nurmerey Shakhanova Date: Thu, 23 Jan 2020 09:56:12 -0800 Subject: [PATCH 15/15] Added contributers --- .../migrations/0016_auto_20200123_1721.py | 55 +++++++++++++++++++ scprojects/models.py | 28 ++++++---- 2 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 scprojects/migrations/0016_auto_20200123_1721.py diff --git a/scprojects/migrations/0016_auto_20200123_1721.py b/scprojects/migrations/0016_auto_20200123_1721.py new file mode 100644 index 0000000..860a3d1 --- /dev/null +++ b/scprojects/migrations/0016_auto_20200123_1721.py @@ -0,0 +1,55 @@ +# Generated by Django 2.2.6 on 2020-01-23 17:21 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('scprojects', '0015_project_lead'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='contributors', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='userprofile', + name='avatar_url', + field=models.URLField(blank=True, max_length=255), + ), + migrations.AlterField( + model_name='userprofile', + name='experience_lvl', + field=models.PositiveSmallIntegerField(blank=True), + ), + migrations.AlterField( + model_name='userprofile', + name='github_id', + field=models.PositiveIntegerField(blank=True), + ), + migrations.AlterField( + model_name='userprofile', + name='github_url', + field=models.URLField(blank=True, max_length=255), + ), + migrations.AlterField( + model_name='userprofile', + name='github_username', + field=models.CharField(blank=True, max_length=255), + ), + migrations.AlterField( + model_name='userprofile', + name='gravatar_url', + field=models.URLField(blank=True, max_length=255), + ), + migrations.AlterField( + model_name='userprofile', + name='position', + field=models.CharField(blank=True, max_length=255), + ), + ] diff --git a/scprojects/models.py b/scprojects/models.py index 3b69f1b..b0487a9 100644 --- a/scprojects/models.py +++ b/scprojects/models.py @@ -6,14 +6,14 @@ class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) - experience_lvl = models.PositiveSmallIntegerField() - position = models.CharField(max_length=255) + experience_lvl = models.PositiveSmallIntegerField(blank=True) + position = models.CharField(max_length=255, blank=True) is_active = models.BooleanField() - github_username = models.CharField(max_length=255) - github_id = models.PositiveIntegerField() - github_url = models.URLField(max_length=255) - avatar_url = models.URLField(max_length=255) - gravatar_url = models.URLField(max_length=255) + github_username = models.CharField(max_length=255, blank=True) + github_id = models.PositiveIntegerField(blank=True) + github_url = models.URLField(max_length=255, blank=True) + avatar_url = models.URLField(max_length=255, blank=True) + gravatar_url = models.URLField(max_length=255, blank=True) class Project(models.Model): @@ -23,17 +23,23 @@ class Project(models.Model): looking_for = models.TextField() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - # get lead info bundle lead = models.ForeignKey( UserProfile, on_delete=models.SET_NULL, null=True, related_name="leads") - # contributors = models.ManyToManyField(User) + contributors = models.ManyToManyField(User) def __str__(self): return self.name + def getInitials(self, user): + return user.first_name[0] + user.last_name[0] + def dict_format(self): - print(self.lead) + contributers_list = [ + self.getInitials(user) for user in self.contributors.all()] + print("contributors", contributers_list) + # get lead info bundle + lead_obj = {} lead_obj["name"] = self.lead.user.first_name + \ ' ' + self.lead.user.last_name @@ -48,5 +54,5 @@ def dict_format(self): "looking_for": self.looking_for, "created": self.created, "updated": self.updated, - # "contributors": self.contributors, + "contributors": contributers_list, }