diff --git a/bodyrep/apps/core/auth/__init__.py b/bodyrep/apps/core/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bodyrep/apps/core/auth/views.py b/bodyrep/apps/core/auth/views.py new file mode 100644 index 0000000..0d7add8 --- /dev/null +++ b/bodyrep/apps/core/auth/views.py @@ -0,0 +1,73 @@ +import urllib +import urlparse + +from django.contrib.auth.decorators import login_required +from django.core.urlresolvers import reverse +from django.contrib.auth.models import User +from django.contrib.sites.models import Site +from django.http import HttpResponseForbidden, HttpResponseRedirect +from django.conf import settings +from utils.functions import ajax_login_required, render_to + +from vendor import facebook + +@render_to('core/auth/facebook.html') +def facebook_connect(request): + facebook_app_id = settings.FACEBOOK_APP_ID + facebook_secret = settings.FACEBOOK_SECRET + + args = { + "client_id": facebook_app_id, + "redirect_uri": "http://" + Site.objects.get_current().domain + reverse('facebook-connect'), + "scope": "offline_access,user_website,publish_actions", + "display": "popup", + } + + verification_code = request.REQUEST.get('code') + if verification_code: + args["client_secret"] = facebook_secret + args["code"] = verification_code + uri = "https://graph.facebook.com/oauth/access_token?" + \ + urllib.urlencode(args) + response_text = urllib.urlopen(uri).read() + response = urlparse.parse_qs(response_text) + + if "access_token" not in response: + logging.user(request, "~BB~FRFailed Facebook connect") + return dict(error="Facebook has returned an error. Try connecting again.") + + access_token = response["access_token"][-1] + + # Get the user's profile. + graph = facebook.GraphAPI(access_token) + profile = graph.get_object("me") + uid = profile["id"] + + # Be sure that two people aren't using the same Facebook account. + existing_user = MSocialServices.objects.filter(facebook_uid=uid) + if existing_user and existing_user[0].user_id != request.user.pk: + user = User.objects.get(pk=existing_user[0].user_id) + #logging.user(request, "~BB~FRFailed FB connect, another user: %s" % user.username) + return dict(error=("Another user (%s, %s) has " + "already connected with those Facebook credentials." + % (user.username, user.email or "no email"))) + + social_services, _ = MSocialServices.objects.get_or_create(user_id=request.user.pk) + social_services.facebook_uid = uid + social_services.facebook_access_token = access_token + social_services.syncing_facebook = True + social_services.save() + + SyncFacebookFriends.delay(user_id=request.user.pk) + + #srequest, "~BB~FRFinishing Facebook connect") + return {} + elif request.REQUEST.get('error'): + #logging.user(request, "~BB~FRFailed Facebook connect") + return {'error': '%s... Try connecting again.' % request.REQUEST.get('error')} + else: + # Start the OAuth process + #logging.user(request, "~BB~FRStarting Facebook connect") + url = "https://www.facebook.com/dialog/oauth?" + urllib.urlencode(args) + return {'next': url} + \ No newline at end of file diff --git a/bodyrep/apps/core/forms.py b/bodyrep/apps/core/forms.py index 33398a7..7eef456 100644 --- a/bodyrep/apps/core/forms.py +++ b/bodyrep/apps/core/forms.py @@ -1,9 +1,13 @@ import datetime + +# Django from django import forms from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User from django.contrib.auth import authenticate from django.db.models import Q + +# Br from apps.core.models import Members class LoginForm(forms.Form): @@ -13,7 +17,6 @@ class LoginForm(forms.Form): password = forms.CharField(label=_("Password"), widget=forms.PasswordInput(attrs={'tabindex': 2, 'class': 'NB-input'}), required=False) - # error_messages={'required': 'Please enter a password.'}) def __init__(self, *args, **kwargs): self.user_cache = None @@ -35,18 +38,16 @@ class LoginForm(forms.Form): if self.user_cache is None: self.user_cache = authenticate(username=email_username[0].username, password="") if self.user_cache is None: - # logging.info(" ***> [%s] Bad Login: TRYING JK-LESS PASSWORD" % username) jkless_password = password.replace('j', '').replace('k', '') self.user_cache = authenticate(username=username, password=jkless_password) if self.user_cache is None: - #logging.info(" ***> [%s] Bad Login" % username) - raise forms.ValidationError(_("Whoopsy-daisy. Try again.")) - else: + raise forms.ValidationError(_("Login failed. Try again")) +# else: # Supreme fuck-up. Accidentally removed the letters J and K from # all user passwords. Re-save with correct password. #logging.info(" ***> [%s] FIXING JK-LESS PASSWORD" % username) - self.user_cache.set_password(password) - self.user_cache.save() + # self.user_cache.set_password(password) + # self.user_cache.save() if not self.user_cache.is_active: raise forms.ValidationError(_("This account is inactive.")) elif username and not user: diff --git a/bodyrep/apps/core/views.py b/bodyrep/apps/core/views.py index 04ff199..f3c16ef 100644 --- a/bodyrep/apps/core/views.py +++ b/bodyrep/apps/core/views.py @@ -1,7 +1,8 @@ import datetime import time import sys -from django.shortcuts import get_object_or_404 + +# Django from django.shortcuts import render, render_to_response from django.contrib.auth.decorators import login_required from django.template.loader import render_to_string @@ -13,20 +14,17 @@ from django.contrib.auth import logout as logout_user from django.contrib.auth.models import User from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404 from django.conf import settings -from django.core.mail import mail_admins -from django.core.validators import email_re -from django.core.mail import EmailMultiAlternatives from django.contrib.sites.models import Site -from bodyrep.apps.core.forms import LoginForm, EditProfileForm from django.core.context_processors import csrf from django.template import RequestContext + +# Libs from annoying.decorators import render_to, ajax_request +# BR +from apps.core.forms import LoginForm, EditProfileForm from apps.core.models import Members - -from utils.user_functions import get_user, ajax_login_required -from utils.view_functions import get_argument_or_404, render_to, is_true -#from utils.ratelimit import ratelimit +from utils.functions import get_user, render_to @render_to('core/landing.html') def index(request): @@ -40,9 +38,13 @@ def showUserProfile(request): member = Members.objects.get(username=request.user.username) return {'member': member} +@login_required @render_to('core/member/profile.html') def showMemberProfile(request, username): - member = Members.objects.get(username=username) + try: + member = Members.objects.get(username=username) + except Members.DoesNotExist: + return render_to_response('core/errors/memberNotFound.html') if request.user.is_anonymous(): return login(request) @@ -53,7 +55,7 @@ def showMemberProfile(request, username): @render_to('core/auth/login.html') def login(request): if not request.user.is_anonymous(): - return HttpResponseRedirect(reverse('mprofile')) + return HttpResponseRedirect(reverse('showUserProfile')) if request.method == "POST": if request.POST.get('submit', '').startswith('log'): @@ -75,7 +77,7 @@ def dologin(request): form = LoginForm(request.POST, prefix='login') if form.is_valid(): login_user(request, form.get_user()) - return HttpResponseRedirect(reverse('mprofile')) + return HttpResponseRedirect(reverse('showUserProfile')) else: message = form.errors.items()[0][1][0] @@ -92,6 +94,7 @@ def logout(request): @ajax_request @render_to('core/user/editProfile.html') def editUserProfile(request): + sys.stderr.write('xxx\n\n') if request.user.is_anonymous(): return login(request) else: diff --git a/bodyrep/media/css/site.css b/bodyrep/media/css/site.css index 68c8144..c5de81f 100644 --- a/bodyrep/media/css/site.css +++ b/bodyrep/media/css/site.css @@ -12,6 +12,12 @@ display: none; width : 170px; border-right : 1px solid #e6e6e6; } +#banner p { + padding: 20px 0px; + font-size: 15px; + font-weight: bold; + color: navy; +} .mc-profile-pic { width : 140px; diff --git a/bodyrep/media/js/application.js b/bodyrep/media/js/application.js index 982306f..87f1728 100644 --- a/bodyrep/media/js/application.js +++ b/bodyrep/media/js/application.js @@ -1,7 +1,7 @@ $(function() { $('#edprf').unbind().live('click', function() { - $.get('/app_dev.php/m/profile/edit', {}, function(data) { + $.get('/m/profile/edit', {}, function(data) { $('#mcnt').html(data); }); }); @@ -19,7 +19,7 @@ $(function() { $.post(frm.attr('action'), frm.serialize(), function(response) { if(response.result) - $('#mcnt').append('Updated'); + $('#banner').html('
Profile Updated
'); }); return false; }); diff --git a/bodyrep/settings.py b/bodyrep/settings.py index 407abfa..47dd5f5 100644 --- a/bodyrep/settings.py +++ b/bodyrep/settings.py @@ -60,6 +60,9 @@ PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.BCryptPasswordHasher', ) +FACEBOOK_APP_ID = '' +FACEBOOK_SECRET = '' + ADMIN_MEDIA_PREFIX = '/static/admin/' # Additional locations of static files diff --git a/bodyrep/templates/core/errors/memberNotFound.html b/bodyrep/templates/core/errors/memberNotFound.html new file mode 100644 index 0000000..d72c775 --- /dev/null +++ b/bodyrep/templates/core/errors/memberNotFound.html @@ -0,0 +1,7 @@ +{% extends 'base.html' %} + +{% block content %} + +Member not found + +{% endblock %} diff --git a/bodyrep/templates/core/user/editProfile.html b/bodyrep/templates/core/user/editProfile.html index a795eb1..a46901e 100644 --- a/bodyrep/templates/core/user/editProfile.html +++ b/bodyrep/templates/core/user/editProfile.html @@ -1,9 +1,9 @@ {% block content %}