Skip to content
Snippets Groups Projects
Commit 9844ad12 authored by Nathan Bills's avatar Nathan Bills
Browse files

Merge pull request #9 from ndbills/develop

Merging develop into master
parents f762c7ad 58338020
No related branches found
No related tags found
No related merge requests found
Showing
with 220 additions and 58 deletions
#!/usr/bin/python
import sys, logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, '/var/www/MyMovieLibrary/')
from project import app as application
\ No newline at end of file
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
__version__ = '0.1' __version__ = '0.1'
import sys,os.path
if os.path.exists('/var/www/pytmdb3'):
sys.path.append('/var/www/pytmdb3')
elif os.path.exists('../pytmdb3'):
sys.path.append('../pytmdb3/')
from functools import wraps from functools import wraps
from flask import Flask, session, redirect, url_for, request, render_template from flask import Flask, session, redirect, url_for, request, render_template
from flask_debugtoolbar import DebugToolbarExtension from flask_debugtoolbar import DebugToolbarExtension
from flask.ext.mongoengine import MongoEngine from flask.ext.mongoengine import MongoEngine
import sys
sys.path.append('../pytmdb3/')
from tmdb3 import set_key from tmdb3 import set_key
set_key('542606a6ccff81a0337dc370a0cbfc37')
app = Flask('project') app = Flask('project')
app.config['SECRET_KEY'] = 'random' app.config['SECRET_KEY'] = 'random'
app.config['MONGODB_SETTINGS'] = {'DB': 'my_movie_library'} app.config['MONGODB_SETTINGS'] = {'DB': 'my_movie_library'}
app.config['SMTP_USER'] = ""
app.config['SMTP_PASSWORD'] = ""
app.config['SMTP_SERVER'] = "smtp.gmail.com:587"
app.config['TMDB_API_KEY'] = ""
set_key(app.config['TMDB_API_KEY'])
# app.config["MONGODB_SETTINGS"] = {'DB': "my_movie_library", # app.config["MONGODB_SETTINGS"] = {'DB': "my_movie_library",
# 'host': '192.168.1.89'} # 'host': '192.168.1.89'}
app.debug = True # app.debug = True
# toolbar = DebugToolbarExtension(app) # toolbar = DebugToolbarExtension(app)
db = MongoEngine(app) db = MongoEngine(app)
# app.debug = True # app.debug = True
...@@ -40,15 +50,15 @@ def security(role=None): ...@@ -40,15 +50,15 @@ def security(role=None):
if len(role) == 0: if len(role) == 0:
return func(*args,**kwargs); return func(*args,**kwargs);
elif user == None: elif user == None:
return redirect(url_for('login', next=request.url)) return redirect(url_for('start', next=request.url))
for r in role: for r in role:
if r in user.roles: if r in user.roles:
return func(*args,**kwargs); return func(*args,**kwargs);
return redirect(url_for('login', next=request.url)) return redirect(url_for('start', next=request.url))
if user == None or role not in user.roles: if user == None or role not in user.roles:
return redirect(url_for('login', next=request.url)) return redirect(url_for('start', next=request.url))
return func(*args,**kwargs); return func(*args,**kwargs);
return security_check return security_check
......
...@@ -30,7 +30,7 @@ def removeLibrary(user = None): ...@@ -30,7 +30,7 @@ def removeLibrary(user = None):
library = Library.objects(user=user,unit='Movie',name=name).first() library = Library.objects(user=user,unit='Movie',name=name).first()
if not library: if not library:
return jsonify(response='error',message='Library requested does not exists'),404 return jsonify(response='error',message='Library requested does not exists'),404
if library.name == 'Master' or library.name == 'Borrowed': if library.name == 'Master' or library.name == 'Loaned':
return jsonify(response='error',message='Library %s cannot be deleted' % library.name),404 return jsonify(response='error',message='Library %s cannot be deleted' % library.name),404
library.delete() library.delete()
return jsonify(response='success',type='redirect',path=url_for(endpoint='libraries',_external=True)) return jsonify(response='success',type='redirect',path=url_for(endpoint='libraries',_external=True))
...@@ -54,7 +54,7 @@ def libraryItem(name, index,user=None): ...@@ -54,7 +54,7 @@ def libraryItem(name, index,user=None):
movie = library.hydrateUnit(index-1) movie = library.hydrateUnit(index-1)
if not movie: if not movie:
return render_template('404.html',message='Unable to find given Movie',user=user),404 return render_template('404.html',message='Unable to find given Movie',user=user),404
return render_template('library/libraryItem.html',item=movie,user=user) return render_template('library/libraryItem.html',item=movie,user=user,library=library,index=index)
@app.route('/libraries/<name>/remove', methods=['POST']) @app.route('/libraries/<name>/remove', methods=['POST'])
@security('user') @security('user')
...@@ -110,7 +110,7 @@ def addlibraryItem(name,user=None): ...@@ -110,7 +110,7 @@ def addlibraryItem(name,user=None):
movie = Movie.convertMovie(movie) movie = Movie.convertMovie(movie)
library.addUnit(movie) library.addUnit(movie)
if library.name != 'Master': if library.name != 'Master':
master = Library(user=user,name="Master",unit='Movie').first() master = Library.objects(user=user,name="Master",unit='Movie').first()
master.addUnit(movie) master.addUnit(movie)
return jsonify(response='success',type='redirect',path=url_for(endpoint='library',name=name,_external=True)) return jsonify(response='success',type='redirect',path=url_for(endpoint='library',name=name,_external=True))
\ No newline at end of file
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from project import app, security from project import app, security
from flask import render_template, request from flask import render_template, request, jsonify
from flask.ext.wtf import Form, TextField, validators from flask.ext.wtf import Form, TextField, validators
@app.route('/loaned') @app.route('/loaned')
@security('user') @security('user')
def loaned(user=None): def loaned(user=None):
return render_template('loan/master.html', user=user) from project.model.Movie import Movie
\ No newline at end of file from project.model.Library import Library
library = Library.objects(user=user,name="Loaned",unit='Movie').first()
if not library:
return render_template('404.html',message='Unable to find given Library',user=user),404
return render_template('library/library.html',library=library,user=user)
@app.route('/send-reminder', methods=['POST'])
@security('user')
def reminderEmail(user=None):
import smtplib
from_addr = user.email
subject = request.form['subject'] or "Movie Return Reminder"
movie_id = request.form['movie']
if not movie_id:
return jsonify(response='error',message='Invalid Movie given'),404
from project.model.Movie import Movie
movie = Movie.objects(id=movie_id).first()
if not movie:
return jsonify(response='error',message='Invalid Movie given'),404
loan = movie.getLoan(user)
if not loan:
return jsonify(response='error',message='Invalid Movie given'),404
to_addr = loan.borrower_email
message = request.form['message'] or "The movie %s, that you borrowed from %s has asked that you return the movie by %s" % (movie.title, user.email, loan.expected_return_date.strftime('%m-%d-%Y'))
login = app.config['SMTP_USER']
password = app.config['SMTP_PASSWORD']
smtpserver= app.config['SMTP_SERVER']
header = 'From: %s\n' % from_addr
header += 'To: %s\n' % to_addr
header += 'Subject: %s\n\n' % subject
message = header + message
server = smtplib.SMTP(smtpserver)
server.starttls()
server.login(login,password)
problems = server.sendmail(from_addr, to_addr, message)
server.quit()
return jsonify(response='success',type="reload")
@app.route('/loan-movie', methods=['POST'])
@security('user')
def createLoan(user=None):
from datetime import datetime
borrower = request.form['email']
return_date = request.form['date'] or None
movie_id = request.form['movie']
if return_date:
return_date = datetime.strptime(return_date, '%m/%d/%Y')
if return_date <= datetime.now():
return jsonify(response='error',message='Return date must be in the future'),404
if not movie_id:
return jsonify(response='error',message='Invalid Movie given'),404
from project.model.Movie import Movie
movie = Movie.objects(id=movie_id).first()
if not movie:
return jsonify(response='error',message='Invalid Movie given'),404
from project.model.Loan import Loan
loan = Loan.objects(user=user,movie=movie).first()
if loan:
return jsonify(response='error',message='A loan already exists for this movie'),404
loan = Loan.create(user,movie,borrower,return_date)
from project.model.Library import Library
borrowed_lib = Library.objects(user=user,unit="Movie",name="Loaned").first()
borrowed_lib.addUnit(movie)
return jsonify(response='success',type="reload")
@app.route('/return-movie', methods=['POST'])
@security('user')
def returnMovie(user=None):
movie_id = request.form['id']
if not movie_id:
return jsonify(response='error',message='Invalid Movie given'),404
from project.model.Movie import Movie
movie = Movie.objects(id=movie_id).first()
if not movie:
return jsonify(response='error',message='Invalid Movie given'),404
from project.model.Loan import Loan
loan = Loan.objects(user=user,movie=movie).first()
if not loan:
return jsonify(response='error',message='This movie has not been loaned out and cannot be returned'),404
from project.model.Library import Library
borrowed_lib = Library.objects(user=user,unit="Movie",name="Loaned").first()
borrowed_lib.removeUnit(movie)
loan.delete()
return jsonify(response='success',type="reload")
\ No newline at end of file
...@@ -37,7 +37,7 @@ def signup(): ...@@ -37,7 +37,7 @@ def signup():
user.addRole('user').save() user.addRole('user').save()
session['user'] = user.toJSON() session['user'] = user.toJSON()
Library(user=user, unit='Movie', name='Master').save() Library(user=user, unit='Movie', name='Master').save()
Library(user=user, unit='Movie', name='Borrowed').save() Library(user=user, unit='Movie', name='Loaned').save()
return jsonify(response='success',type='redirect',path=url_for(endpoint='libraries',_external=True)) return jsonify(response='success',type='redirect',path=url_for(endpoint='libraries',_external=True))
@app.route('/logout', methods=['GET', 'POST']) @app.route('/logout', methods=['GET', 'POST'])
......
...@@ -5,8 +5,14 @@ from flask.ext.wtf import Form, TextField, validators ...@@ -5,8 +5,14 @@ from flask.ext.wtf import Form, TextField, validators
@app.route('/movies') @app.route('/movies')
def movies(): @security('user')
return render_template('movies/master.html') def movies(user=None):
from project.model.Movie import Movie
from project.model.Library import Library
library = Library.objects(user=user,name="Master",unit='Movie').first()
if not library:
return render_template('404.html',message='Unable to find given Library',user=user),404
return render_template('library/library.html',library=library,user=user)
@app.route('/movies/<movieId>') @app.route('/movies/<movieId>')
def movie_item(movieId): def movie_item(movieId):
......
# -*- coding: utf-8 -*-
from project import app
from flask import render_template, request
from flask.ext.wtf import Form, TextField, validators
import datetime
class CreateForm(Form):
text = TextField(u'Text:', [validators.Length(min=1, max=200)])
@app.route('/test', methods=['GET', 'POST'])
def test():
form = CreateForm(request.form)
if request.method == 'POST' and form.validate():
from project.models.Test import Test
test = Test()
test.show_string(form.text.data)
return render_template('test/index.html')
return render_template('test/test.html', form=form)
@app.route('/test-user')
def test_user():
from project.model.User import User
test_user = User.createUser(email='ndbills@gmail.com', password='password')
#check if test_user exists
#if yes, return a success render_template
#else add the user and return some other template
return render_template('test/test-user.html')
\ No newline at end of file
...@@ -7,7 +7,6 @@ class Library(db.Document): ...@@ -7,7 +7,6 @@ class Library(db.Document):
name = db.StringField(max_length=100, unique_with=['user','unit']) #name of the Library name = db.StringField(max_length=100, unique_with=['user','unit']) #name of the Library
lookup_attribute = db.StringField(default='id') lookup_attribute = db.StringField(default='id')
collection = db.ListField(db.StringField()) collection = db.ListField(db.StringField())
summary = db.StringField()
def addUnit(self,unit): def addUnit(self,unit):
if self.unit == type(unit).__name__: if self.unit == type(unit).__name__:
......
...@@ -12,7 +12,7 @@ class Loan(db.Document): ...@@ -12,7 +12,7 @@ class Loan(db.Document):
@staticmethod @staticmethod
def create(user,movie,email,expected_return_date=None): def create(user,movie,email,expected_return_date=None):
info = Loan(user=user,movie=movie,email=email) info = Loan(user=user,movie=movie,borrower_email=email)
if expected_return_date: if expected_return_date:
info.expected_return_date = expected_return_date info.expected_return_date = expected_return_date
else: else:
......
...@@ -6,6 +6,8 @@ class Movie(db.Document): ...@@ -6,6 +6,8 @@ class Movie(db.Document):
title = db.StringField(max_length=255, required=True) title = db.StringField(max_length=255, required=True)
summary = db.StringField(max_length=10000, required=True) summary = db.StringField(max_length=10000, required=True)
tags = db.ListField(db.StringField(max_length=50)) tags = db.ListField(db.StringField(max_length=50))
cast = db.ListField(db.StringField())
director = db.StringField()
tmdb_id = db.IntField() tmdb_id = db.IntField()
runtime = db.IntField() runtime = db.IntField()
poster = db.StringField() poster = db.StringField()
...@@ -21,6 +23,11 @@ class Movie(db.Document): ...@@ -21,6 +23,11 @@ class Movie(db.Document):
self.tags.remove(tag) self.tags.remove(tag)
return self return self
def getLoan(self,user):
from Loan import Loan
loan = Loan.objects(movie=self,user=user).first()
return loan
def __str__(self): def __str__(self):
return self.title return self.title
...@@ -42,13 +49,21 @@ class Movie(db.Document): ...@@ -42,13 +49,21 @@ class Movie(db.Document):
if len(sizes) > 0: if len(sizes) > 0:
medium = int(len(sizes)/2) medium = int(len(sizes)/2)
result.poster = str(movie.poster.geturl(sizes[medium])) result.poster = str(movie.poster.geturl(sizes[medium]))
result.popularity = float(movie.popularity) result.popularity = float(movie.userrating)
result.runtime = int(movie.runtime) result.runtime = int(movie.runtime)
tags = movie.keywords tags = movie.keywords
for tag in tags: for tag in tags:
result.addTag(str(tag)) result.addTag(str(tag.name.encode('utf-8')))
genres = movie.genres genres = movie.genres
for genre in genres: for genre in genres:
result.addTag(str(genre)) result.addTag(str(genre.name.encode('utf-8')))
cast = movie.cast
for actor in cast:
result.cast.append("%s:%s" % (actor.name,actor.character))
crew = movie.crew
for person in crew:
job = person.job.encode('utf-8')
if 'director' == job.lower():
result.director = person.name.encode('utf-8')
result.save() result.save()
return result return result
...@@ -2,16 +2,23 @@ html,body { ...@@ -2,16 +2,23 @@ html,body {
height: 100%; height: 100%;
} }
#homepage-responsive-image {
width: 100%;
}
#wrap { #wrap {
min-height: 100%; min-height: 100%;
height: auto !important; height: auto !important;
height: 100%; height: 100%;
margin: 0 auto -60px; margin: 0 auto -110px;
}
#push {
height: 105px;
} }
#push,
#footer { #footer {
height: 60px; height: 92px;
} }
@media (max-width: 767px) { @media (max-width: 767px) {
...@@ -49,3 +56,57 @@ html,body { ...@@ -49,3 +56,57 @@ html,body {
max-height: 500px; max-height: 500px;
overflow-y: scroll; overflow-y: scroll;
} }
dl {
width:100%;
overflow:hidden;
}
dt {
float:left;
width:50%; /* adjust the width; make sure the total of both is 100% */
}
dd {
float:left;
width:50%; /* adjust the width; make sure the total of both is 100% */
}
.rating-text {
margin: 0 auto;
width: 20px;
color: gold;
}
.rating {
unicode-bidi: bidi-override;
direction: rtl;
width: 20px;
margin: 0 auto;
}
.rating > span.rated:before,
.rating > span.rated ~ span:before {
content: "\2605";
position: absolute;
color: gold;
}
#lib_paginate {
/*margin-top: -20px;*/
}
span.vert{
font-size: 22px;
}
@media (max-width: 568px) {
span.vert {
display: inline-block;
}
.rating {
width: 90%;
display: inline-block;
}
.rating-text{
display: inline-block;
}
}
\ No newline at end of file
project/static/css/ui-darkness/images/animated-overlay.gif

1.7 KiB

project/static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png

220 B

project/static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png

230 B

project/static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png

260 B

project/static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png

342 B

project/static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png

316 B

project/static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png

3.73 KiB

project/static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png

276 B

project/static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png

275 B

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment