Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
ef0ee37
Front end time
Feb 24, 2015
295c46c
Authentication is working, need to add in rest of the views
Feb 25, 2015
296e217
Registration, login, logout implemented on both front and backend
Feb 25, 2015
b54ca17
model updates, front end set up
shanarae Feb 25, 2015
3ac01c0
suman commit 1 frontend
Feb 25, 2015
6b79228
Removed sqlite3 db from git cache
Feb 25, 2015
b064e6f
items migration files removed
Feb 25, 2015
a7f3d08
deleted sqlite
shanarae Feb 25, 2015
144595f
removing sqlite3 file
shanarae Feb 25, 2015
ebdf937
Merge pull request #1 from kenkaden/kenkaden-frontend
kenkaden Feb 25, 2015
5cb0a6b
commiting before mergering
Feb 25, 2015
832fd0e
commiting before mergering 2nd time
Feb 25, 2015
afb74bf
main.css changed
Feb 25, 2015
08d9b92
just to add skumo
Feb 25, 2015
e7e5814
added login links to nav bar
Feb 25, 2015
f1e7e78
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
Feb 25, 2015
defb246
Authentication on Angular with validation complete
Feb 26, 2015
b08a92a
shanarae 2/25 updates
shanarae Feb 26, 2015
58590db
shanarae 2/25 updates
shanarae Feb 26, 2015
c7b52cb
commit for add friend and friendscrap
Feb 26, 2015
93612c0
resolve line missing now added on app.js
shanarae Feb 26, 2015
7ef89ab
commit2
Feb 26, 2015
8d24a54
css color change
shanarae Feb 26, 2015
cc42c8f
10:57 update
shanarae Feb 26, 2015
59d1b14
2/26 afternoon push
shanarae Feb 26, 2015
dcb8151
commit 4
Feb 26, 2015
5f3cffd
Fixed Followers from duplicating
Feb 26, 2015
1057e2f
commit 5
Feb 26, 2015
7f9092f
Merged with team
Feb 26, 2015
44dce07
Added depth = 1 to FollowerSerializer
Feb 26, 2015
4f7b412
commit 5
Feb 26, 2015
5624bc7
commit 6
Feb 26, 2015
ef8aa8c
after dropping the db
Feb 26, 2015
c4e8ebf
after dropping the db
Feb 26, 2015
94b74b0
Fixed FollowerListAPIView, only returns items for current logged in user
Feb 26, 2015
d6c9a1a
aftb
Feb 26, 2015
d4a5815
aftb
Feb 26, 2015
b442f96
no new updates
shanarae Feb 26, 2015
1507ac9
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
shanarae Feb 26, 2015
c0a9593
Created Secure Friends Detail API
Feb 27, 2015
ff87db2
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
Feb 27, 2015
c6cc537
aftb
Feb 27, 2015
a7563fd
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
Feb 27, 2015
eb887e6
2/26 evening push shanarae
shanarae Feb 27, 2015
39ede19
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
shanarae Feb 27, 2015
7f217d5
aftb
Feb 27, 2015
23b8f48
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
Feb 27, 2015
315436d
aftb
Feb 27, 2015
bf8d831
shanarae cosmetic updates
shanarae Feb 27, 2015
4262ab7
Updated redirect to friends in login.js
Feb 27, 2015
13c3cb3
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
Feb 27, 2015
aef0545
Fixed all CSRF issues with PATCH and DELETE methods
Feb 27, 2015
b24286e
commit this morning
Feb 27, 2015
4ff1b65
commit this morning
Feb 27, 2015
6ce3d6c
2/27am shanarae updates
shanarae Feb 27, 2015
a56802d
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
shanarae Feb 27, 2015
f99f112
committed for pull
Feb 27, 2015
5162838
updated friendscrap.html conflict
Feb 27, 2015
68c3574
shanarae friends delete update
shanarae Feb 27, 2015
3999a37
incomplete friendscrap
Feb 27, 2015
3f20488
fixed conflict for friendscrap.html
Feb 27, 2015
dc670f6
commit this morning
Feb 27, 2015
3e3d5ab
Merge branch 'frontend' of https://github.com/kenkaden/declutter into…
Feb 27, 2015
59a820b
delete function for friends operational
Feb 27, 2015
8c5a66e
fixed conflict in friendscrap.js
Feb 27, 2015
e3401ca
claims still not working
Feb 28, 2015
bf216b0
Everything works now
Mar 4, 2015
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local_settings.py
*.pyc
.idea/
declutter_db.sqlite3
declutter_db.sqlite3
declutter_db.sqlite3.orig
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# decluttter
App to declutter your life.
App to declutter your life and then stuff.
10 changes: 6 additions & 4 deletions appuser/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('items', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='Follower',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('followee', models.IntegerField()),
('follower', models.IntegerField()),
('followee', models.ForeignKey(related_name='followee', to=settings.AUTH_USER_MODEL)),
('follower', models.ForeignKey(related_name='follower', to=settings.AUTH_USER_MODEL)),
],
options={
},
Expand All @@ -27,9 +28,10 @@ class Migration(migrations.Migration):
name='Stream',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('item', models.TextField(max_length=120)),
('created', models.DateField(auto_now_add=True)),
('created', models.DateField(null=True, blank=True)),
('status', models.BooleanField(default=True)),
('deleted_status', models.BooleanField(default=False)),
('item', models.ForeignKey(related_name='item_id', to='items.Item')),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
],
options={
Expand Down
20 changes: 0 additions & 20 deletions appuser/migrations/0002_stream_deleted_status.py

This file was deleted.

9 changes: 5 additions & 4 deletions appuser/models.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from django.db import models
from django.contrib.auth.models import User
from items.models import Item

# Create your models here.

class Stream(models.Model):
item = models.TextField(max_length=120)
created = models.DateField(auto_now_add=True)
item = models.ForeignKey(Item, related_name='item_id')
created = models.DateField(null=True, blank=True)
status = models.BooleanField(default=True)
deleted_status = models.BooleanField(default=False)
user = models.ForeignKey(User)
Expand All @@ -15,8 +16,8 @@ def __unicode__(self):


class Follower(models.Model):
followee = models.IntegerField()
follower = models.IntegerField()
followee = models.ForeignKey(User, related_name="followee")
follower = models.ForeignKey(User, related_name="follower")

def __unicode__(self):
return u"Followee: {}, Follower: {}".format(self.followee, self.follower)
2 changes: 1 addition & 1 deletion appuser/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
class StreamSerializer(serializers.ModelSerializer):
class Meta:
model = Stream
fields = ("id", "item", "created", "status", "deleted_status")
fields = ("id", "item", "created", "status", "deleted_status", "user")


class FollowerSerializer(serializers.ModelSerializer):
Expand Down
5 changes: 3 additions & 2 deletions appuser/urls.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from django.conf.urls import patterns, url
from appuser.views import StreamListCreateAPIView, StreamRetrieveUpdateDestroyAPIView, FollowerCreateAPIView, \
FollowerRetrieveUpdateDestroyAPIView, FollowerListAPIView
FollowerRetrieveUpdateDestroyAPIView, FollowerListAPIView, FollowerFriendsDetailListAPIView

urlpatterns = patterns('',
url(r'^list/$', StreamListCreateAPIView.as_view()),
url(r'^update/(?P<stream_id>\w+)$', StreamRetrieveUpdateDestroyAPIView.as_view()),
url(r'^create/follower/$', FollowerCreateAPIView.as_view()),
url(r'list/follower/$', FollowerListAPIView.as_view()),
url(r'^update/follower/(?P<followee_id>.+)/(?P<follower_id>.+)/$', FollowerRetrieveUpdateDestroyAPIView.as_view())
url(r'^update/follower/(?P<followee_id>.+)/(?P<follower_id>.+)/$', FollowerRetrieveUpdateDestroyAPIView.as_view()),
url(r'^detail/follower/(?P<user_id>.+)/(?P<follower_id>.+)/$', FollowerFriendsDetailListAPIView.as_view())
)

__author__ = 'andy'
58 changes: 52 additions & 6 deletions appuser/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@
from appuser.models import Stream, Follower
from rest_framework.generics import ListAPIView, CreateAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
from appuser.serializers import StreamSerializer, FollowerSerializer
from items.api.serializers import UserSerialize
from django.contrib.auth.models import User
import pdb


class StreamListCreateAPIView(ListCreateAPIView):
queryset = Stream.objects.all()
serializer_class = StreamSerializer

def get_queryset(self):
user = self.request.user
return Stream.objects.filter(user=user)

def post(self, request, *args, **kwargs):
serializer = StreamSerializer(data=request.data)
if serializer.is_valid():
Expand Down Expand Up @@ -43,7 +48,7 @@ def put(self, request, stream_id, format=None, *args, **kwargs):

def patch(self, request, stream_id, format=None, *args, **kwargs):
snippet = Stream.objects.get(pk=stream_id)
serializer = StreamSerializer(snippet, data=request.data)
serializer = StreamSerializer(snippet, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
Expand All @@ -61,7 +66,18 @@ class FollowerCreateAPIView(CreateAPIView):
serializer_class = FollowerSerializer

def post(self, request, *args, **kwargs):
follower_id = User.objects.get(email=request.data['follower'])
try:
follower_id = User.objects.get(email=request.data['follower'])

except:
return Response({"error": "This user does not exist"}, status=status.HTTP_404_NOT_FOUND)

try:
if Follower.objects.get(followee=request.user.id, follower=follower_id.id):
return Response({"error": "You are already friends"}, status=status.HTTP_404_NOT_FOUND)

except:
pass

data = {
'followee': request.user.id,
Expand All @@ -76,19 +92,24 @@ def post(self, request, *args, **kwargs):
serializer = FollowerSerializer(data=data)
serializer_reverse = FollowerSerializer(data=data_reverse)


if serializer.is_valid() and serializer_reverse.is_valid():
serializer.save()
serializer_reverse.save()
return Response(serializer.data, status=status.HTTP_200_OK)

else:
return Response({"error": "This stream does not exist"}, status=status.HTTP_404_NOT_FOUND)
return Response({"error": "Please enter a valid email"}, status=status.HTTP_404_NOT_FOUND)


class FollowerListAPIView(ListAPIView):
queryset = Follower.objects.all()
# queryset = Follower.objects.all()
serializer_class = FollowerSerializer

def get_queryset(self):
user = self.request.user.id
return Follower.objects.filter(followee=user)


class FollowerRetrieveUpdateDestroyAPIView(RetrieveUpdateDestroyAPIView):
serializer_class = FollowerSerializer
Expand Down Expand Up @@ -130,4 +151,29 @@ def delete(self, request, followee_id, follower_id, *args, **kwargs):
snippet.delete()
snippet_reverse = Follower.objects.get(followee=follower_id, follower=followee_id)
snippet_reverse.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
return Response(status=status.HTTP_204_NO_CONTENT)

# Setting up authorization model for access by user to friends detail.
class FollowerFriendsDetailListAPIView(ListAPIView):
serializer_class = UserSerialize

def get(self, request, user_id, follower_id, *args, **kwargs):
# pdb.set_trace()
try:
if request.user.id != int(user_id):
return Response({"error": "You are not authorized."}, status=status.HTTP_403_FORBIDDEN)

except:
pass

try:
if not Follower.objects.get(followee=user_id, follower=follower_id.id):
return Response({"error": "You are not friends"}, status=status.HTTP_403_FORBIDDEN)

except:
pass

queryset = User.objects.get(pk=follower_id)
serializer = UserSerialize(queryset)

return Response(serializer.data, status=status.HTTP_200_OK)
Empty file added authentication/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions authentication/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
42 changes: 42 additions & 0 deletions authentication/app_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from django.conf import settings

from rest_auth.serializers import (
TokenSerializer as DefaultTokenSerializer,
UserDetailsSerializer as DefaultUserDetailsSerializer,
LoginSerializer as DefaultLoginSerializer,
PasswordResetSerializer as DefaultPasswordResetSerializer,
PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer,
PasswordChangeSerializer as DefaultPasswordChangeSerializer)
from .utils import import_callable


serializers = getattr(settings, 'REST_AUTH_SERIALIZERS', {})

TokenSerializer = import_callable(
serializers.get('TOKEN_SERIALIZER', DefaultTokenSerializer))

UserDetailsSerializer = import_callable(
serializers.get('USER_DETAILS_SERIALIZER', DefaultUserDetailsSerializer)
)

LoginSerializer = import_callable(
serializers.get('LOGIN_SERIALIZER', DefaultLoginSerializer)
)

PasswordResetSerializer = import_callable(
serializers.get('PASSWORD_RESET_SERIALIZER',
DefaultPasswordResetSerializer)
)

PasswordResetConfirmSerializer = import_callable(
serializers.get('PASSWORD_RESET_CONFIRM_SERIALIZER',
DefaultPasswordResetConfirmSerializer)
)

PasswordChangeSerializer = import_callable(
serializers.get('PASSWORD_CHANGE_SERIALIZER',
DefaultPasswordChangeSerializer)
)


__author__ = 'andy'
Empty file.
3 changes: 3 additions & 0 deletions authentication/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.db import models

# Create your models here.
1 change: 1 addition & 0 deletions authentication/register/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__author__ = 'andy'
85 changes: 85 additions & 0 deletions authentication/register/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
from django.http import HttpRequest
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from rest_framework import status

from allauth.account.views import SignupView, ConfirmEmailView
from allauth.account.utils import complete_signup
from allauth.account import app_settings

from rest_auth.app_settings import UserDetailsSerializer
from rest_auth.registration.serializers import SocialLoginSerializer
from rest_auth.views import Login


class Register(APIView, SignupView):

permission_classes = (AllowAny,)
user_serializer_class = UserDetailsSerializer
allowed_methods = ('POST', 'OPTIONS', 'HEAD')

def get(self, *args, **kwargs):
return Response({}, status=status.HTTP_405_METHOD_NOT_ALLOWED)

def put(self, *args, **kwargs):
return Response({}, status=status.HTTP_405_METHOD_NOT_ALLOWED)

def form_valid(self, form):
self.user = form.save(self.request)
if isinstance(self.request, HttpRequest):
request = self.request
else:
request = self.request._request
return complete_signup(request, self.user,
app_settings.EMAIL_VERIFICATION,
self.get_success_url())

def post(self, request, *args, **kwargs):
self.initial = {}
self.request.POST = self.request.DATA.copy()
form_class = self.get_form_class()
self.form = self.get_form(form_class)
if self.form.is_valid():
self.form_valid(self.form)
return self.get_response()
else:
return self.get_response_with_errors()

def get_response(self):
serializer = self.user_serializer_class(instance=self.user)
return Response(serializer.data, status=status.HTTP_201_CREATED)

def get_response_with_errors(self):
return Response(self.form.errors, status=status.HTTP_400_BAD_REQUEST)


class VerifyEmail(APIView, ConfirmEmailView):

permission_classes = (AllowAny,)
allowed_methods = ('POST', 'OPTIONS', 'HEAD')

def get(self, *args, **kwargs):
return Response({}, status=status.HTTP_405_METHOD_NOT_ALLOWED)

def post(self, request, *args, **kwargs):
self.kwargs['key'] = self.request.DATA.get('key', '')
confirmation = self.get_object()
confirmation.confirm(self.request)
return Response({'message': 'ok'}, status=status.HTTP_200_OK)


class SocialLogin(Login):
"""
class used for social authentications
example usage for facebook

from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter
class FacebookLogin(SocialLogin):
adapter_class = FacebookOAuth2Adapter
"""

serializer_class = SocialLoginSerializer


__author__ = 'andy'
3 changes: 3 additions & 0 deletions authentication/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
20 changes: 20 additions & 0 deletions authentication/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django.conf.urls import patterns, url
from django.contrib import admin
import appuser.urls as user_urls
from authentication.views import Facebooklogin, Login, Logout, PasswordChange, UserDetails
from register.views import Register
admin.autodiscover()

urlpatterns = patterns('',
# Examples:
# url(r'^$', 'declutter.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^facebook/$', Facebooklogin.as_view(), name='fb_login'),
url(r'^login/$', Login.as_view(), name='login'),
url(r'^logout/$', Logout.as_view(), name='logout'),
url(r'^register/$', Register.as_view(), name='register')
)



__author__ = 'andy'
Loading