Skip to content

add fixed, working dojo secrets project #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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 modified .DS_Store
Binary file not shown.
1 change: 1 addition & 0 deletions erica_snider/Assignments/Python/Django/sports_orm
Submodule sports_orm added at 0fc246
1 change: 1 addition & 0 deletions erica_snider/Assignments/Python/Django/sports_orm_ii
Submodule sports_orm_ii added at 0fc246
Empty file.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from __future__ import unicode_literals

from django.apps import AppConfig


class DojoSecretsConfig(AppConfig):
name = 'dojo_secrets'
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2017-03-20 17:41
from __future__ import unicode_literals

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Secret',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=45)),
('last_name', models.CharField(max_length=45)),
('email', models.CharField(max_length=128)),
('password', models.CharField(max_length=256)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.AddField(
model_name='secret',
name='creator',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='my_secrets', to='dojo_secrets.User'),
),
migrations.AddField(
model_name='secret',
name='likes',
field=models.ManyToManyField(related_name='liked_secrets', to='dojo_secrets.User'),
),
]
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2017-03-20 17:43
from __future__ import unicode_literals

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('dojo_secrets', '0001_initial'),
]

operations = [
migrations.RenameField(
model_name='secret',
old_name='text',
new_name='secret',
),
]
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
from __future__ import unicode_literals
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.db import models
from django.db.models import Count
from django.db import connection

import re, bcrypt
EMAIL_REGEX = re.compile(r'^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$')

class UserManager(models.Manager):

def register(self, postData):
errors = []
# VALIDATE FIRST NAME
if len(postData['first_name']) < 1:
errors.append('First name cannot be empty.')
elif len(postData['first_name']) <= 2:
errors.append('First name must be at least two characters.')
# VALIDATE LAST NAME
if len(postData['last_name']) < 1:
errors.append('Last name cannot be empty.')
elif len(postData['last_name']) <= 2:
errors.append('Last name must be at least two characters.')
# VALIDATE EMAIL
if len(postData['email']) < 1:
errors.append('Email cannot be empty')
elif not EMAIL_REGEX.match(postData['email']):
errors.append("Email address must be valid.")
else:
try:
user = User.objects.get(email=postData['email'])
except MultipleObjectsReturned:
errors.append("Email address has already been registered.")
except:
pass
# VALIDATE PASSWORD
if len(postData['password']) < 1:
errors.append("Password cannot be empty.")
elif len(postData['password']) < 8:
errors.append("Password must be at least 8 characters.")
# VALIDATE PASSWORD CONFIRMATION
if postData['password'] != postData['password_conf']:
errors.append("Passwords must match.")

if len(errors) > 0:
return (False, errors)
else:
#ORM query to create
hashed = bcrypt.hashpw(postData['password'].encode(), bcrypt.gensalt()) # creates hashed password to be saved in db
new_user = User.objects.create(first_name=postData['first_name'], last_name=postData['last_name'], email=postData['email'], password=hashed)
# new_user.save()
print 'the newly registered user is', new_user
return (True, new_user.id, new_user.first_name) # new_user.first_name

def login(self, postData):
errors = []
# VALIDATE EMAIL
if len(postData['email']) < 1:
errors.append('Email cannot be empty')
elif not EMAIL_REGEX.match(postData['email']):
errors.append("Email address must be valid.")
# VALIDATE PASSWORD
if len(postData['password']) < 1:
errors.append("Password cannot be empty.")
elif len(postData['password']) < 8:
errors.append("Password must be at least 8 characters.")

if len(errors) > 0:
return (False, errors)
else:
try:
user = User.objects.get(email=postData['email'])
if user.password == bcrypt.hashpw(postData['password'].encode(), user.password.encode()):
print 'logging in user is ', user
return (True, user.id, user.first_name) # user.first_name
else:
errors.append("Email or password is invalid. (password doesn't match)")
return (False, errors)
except ObjectDoesNotExist:
errors.append("Email or password is invalid. (email not found)")
return (False, errors)
except MultipleObjectsReturned:
errors.append("Email or password is invalid. (more than one entry with that email)")
return (False, errors)

def get_likes(self, postData):
# get an array of ids
this_user = User.objects.get(id=postData.session['id'])
# this_users_likes = this_user.all()
# print "the user id is", postData.session['id']
# print "this user is" , this_user
# print "this_users_likes is" , this_user.likes.all()
this_users_likes = this_user.liked_secrets.all().values_list('id', flat=True)
# this_secret = Secret.objects.filter(creator_id = postData.session['id'])
# print [secret.id for secret in this_secret]
print 'this user is ', this_user
print 'this users likes is ', this_users_likes
# likes_on_a_secret = this_secret.likes.all()
# print 'likes on a secret is ', likes_on_a_secret
return (True, this_users_likes)

class SecretManager(models.Manager):
def secrets_recent(self, postData):
# secrets = Secret.objects.annotate(Count('likes')).order_by('-created_at')[:10]
# print Secret.objects.annotate(Count('likes')).order_by('-created_at')[:10].query
secrets = Secret.objects.order_by('-created_at').annotate(Count('likes'))[:10]
return (True, secrets)

def secrets_popular(self):
secrets = Secret.objects.annotate(Count('likes')).order_by('-likes__count')[:10]
return (True, secrets)

def create_secret(self, postData):
errors=[]
if len(postData.POST['secret']) < 1:
errors.append('Secret cannot be empty.')
return (False, errors)
new_secret_creator = User.objects.get(id=postData.session['id'])
secret = Secret.objects.create(secret=postData.POST['secret'], creator=new_secret_creator)
return (True, secret)

def create_like(self, postData, secret_id):
this_secret = Secret.objects.get(id=secret_id)
this_user = User.objects.get(id=postData.session['id'])
this_secret.likes.add(this_user)
return (True)

# def created_ago(self):
# time_ago = timezone.now() - secret.created_at


class User(models.Model):
first_name = models.CharField(max_length=45)
last_name = models.CharField(max_length=45)
email = models.CharField(max_length=128)
password = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
# * my_secrets * (from related_name)
# * liked_secrets * (from related_name)
def __str__(self):
return self.first_name
objects = UserManager()

class Secret(models.Model):
secret = models.TextField()
creator = models.ForeignKey(User, related_name="my_secrets") # creator of the secret; the related name 'psuedo'-creates an array of secrets for each user in the User class (not actually added to database; kept track of by Django and Python)
likes = models.ManyToManyField(User, related_name="liked_secrets")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.secret
objects = SecretManager()
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dojo Secrets</title>
</head>
<body>

<!-- notification area -->

{% if 'user' in request.session %}
<p>Hello, {{request.session.user}}</p>
{% endif %}

{% if messages %}
<ul class="messages">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}

<h1>Register new user</h1>
<form action='/register' method='POST'>
{% csrf_token %}
<label for="first_name">First Name: <input type="text" name="first_name" id="first_name" autofocus></label>
<label for="last_name">Last Name: <input type="text" name="last_name" id="last_name"></label>
<label for="email">Email address: <input type="text" name="email" id="email"></label>
<label for="password">Password: <input type="text" name="password" id="password"></label> <!-- change input to type="password" -->
<label for="password_conf">Password confirmation: <input type="text" name="password_conf" id="password_conf"></label> <!-- change input to type="password" -->
<input type="submit" value="Register">
</form>
<hr/>

<h1>Login</h1>
<form action='/login' method='POST'>
{% csrf_token %}
<label for="email">Email address: <input type="text" name="email" id="email"></label>
<label for="password">Password: <input type="text" name="password" id="password"></label> <!-- change input to type="password" -->
<input type="submit" value="Log In">
</form>
<hr/>

</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dojo Secrets</title>
</head>
<body>

{% if not request.session.logged_in %}

<h3>You must log in.</h3>
<form action='/' method='POST'>
{% csrf_token %}
<input type="submit" value="Return to Log In">
</form>
<hr/>

{% else %}

{% if not request.session.most_popular %}

<!-- notification area -->
{% if 'first_name' in request.session %}
<h1>Hello, {{request.session.first_name}}!</h1>
{% endif %}

<form action='/logout' method='POST'>
{% csrf_token %}
<input type="submit" value="Log Out">
</form>
<hr/>

<form action='/secrets/create' method='POST'>
{% csrf_token %}
<textarea name="secret" rows="8" cols="80"></textarea>
<input type="submit" value="Post">
</form>

<!-- try anchor tag with href equal to the path -->
<form action="/secrets/mostpopular" method="post">
{% csrf_token %}
<input type="submit" name="popular" value="Most Popular Secrets">
</form>

<hr/>

<h1>Recent Secrets...</h1>
<!-- for loop to show secrets -->

{% for each in secrets %}
<p>each: {{each.secret}}, timestamp: {{each.created_at}}, likes: {{each.likes__count}}</p>

{% if each.creator.id == request.session.id %}
<h5>You wrote this!</h5>
{% endif %}

{% if each.id in this_users_likes %}
<h5>You liked this</h5>
{% else %}

<form action="/secrets/{{each.id}}/like" method="post">
{% csrf_token %}
<input type="submit" name="like" value="Like">
</form>

{% endif %}
<hr/>
{% endfor %}

{% else %}

<h1>Most Popular Secrets...</h1>

<form action="/secrets/formandrecent" method="post">
{% csrf_token %}
<input type="submit" name="popular" value="Back">
</form>

<!-- for loop to show secrets -->
{% for each in secrets %}
<p>each: {{each.secret}}, timestamp: {{each.created_at}}, likes: {{each.likes__count}}</p>

{% if each.creator.id == request.session.id %}
<h5>You wrote this!</h5>
{% endif %}

{% if each.id in this_users_likes %}
<h5>You liked this</h5>
{% else %}

<form action="/secrets/{{each.id}}/like" method="post">
{% csrf_token %}
<input type="submit" name="like" value="Like">
</form>

{% endif %}
<hr/>
{% endfor %}

{% endif %}

{% endif %}

</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
Loading