From: Seth Woodworth Date: Wed, 9 Jan 2013 21:53:38 +0000 (-0500) Subject: adding DriveAuth model to notes app, closes #10 X-Git-Tag: release-20150131~585 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=87311b4216ed50fa273eb3bd82f8a18145b58e3f;p=oweals%2Fkarmaworld.git adding DriveAuth model to notes app, closes #10 --- diff --git a/karmaworld/apps/notes/models.py b/karmaworld/apps/notes/models.py index 7456738..e02a386 100644 --- a/karmaworld/apps/notes/models.py +++ b/karmaworld/apps/notes/models.py @@ -7,10 +7,10 @@ Contains only the minimum for handling files and their representation """ import datetime -import os from django.db import models from taggit.managers import TaggableManager +from oauth2client.client import Credentials from karmaworld.apps.courses.models import Course @@ -59,3 +59,39 @@ class Note(models.Model): # resume save super(Note, self).save(*args, **kwargs) + + +# FIXME: replace the following GOOGLE_USER in a settings.py +GOOGLE_USER = 'seth.woodworth@gmail.com' + +class DriveAuth(models.Model): + """ stored google drive authentication and refresh token + used for interacting with google drive """ + + email = models.EmailField(default=GOOGLE_USER) + credentials = models.TextField() # JSON of Oauth2Credential object + stored_at = models.DateTimeField(auto_now=True) + + + @staticmethod + def get(email=GOOGLE_USER): + """ Staticmethod for getting the singleton DriveAuth object """ + # FIXME: this is untested + return DriveAuth.objects.filter(email=email).reverse()[0] + + + def store(self, creds): + """ Transform an existing credentials object to a db serialized """ + self.email = creds.id_token['email'] + self.credentials = creds.to_json() + self.save() + + + def transform_to_cred(self): + """ take stored credentials and produce a Credentials object """ + return Credentials.new_from_json(self.credentials) + + + def __unicode__(self): + return u'Gdrive auth for %s created/updated at %s' % \ + (self.email, self.stored_at) diff --git a/karmaworld/static/css/responsive-tables.css b/karmaworld/static/css/responsive-tables.css new file mode 100644 index 0000000..4765406 --- /dev/null +++ b/karmaworld/static/css/responsive-tables.css @@ -0,0 +1,50 @@ +/* Foundation v2.1.4 http://foundation.zurb.com */ +/* Artfully masterminded by ZURB */ + +/* -------------------------------------------------- + Table of Contents +----------------------------------------------------- +:: Shared Styles +:: Page Name 1 +:: Page Name 2 +*/ + + +/* ----------------------------------------- + Shared Styles +----------------------------------------- */ + +table th { font-weight: bold; } +table td, table th { padding: 9px 10px; text-align: left; } + +/* Mobile */ +@media only screen and (max-width: 767px) { + + table.responsive { margin-bottom: 0; } + + .pinned { position: absolute; left: 0; top: 0; background: #fff; width: 35%; overflow: hidden; overflow-x: scroll; border-right: 1px solid #ccc; border-left: 1px solid #ccc; } + .pinned table { border-right: none; border-left: none; width: 100%; } + .pinned table th, .pinned table td { white-space: nowrap; } + .pinned td:last-child { border-bottom: 0; } + + div.table-wrapper { position: relative; margin-bottom: 20px; overflow: hidden; border-right: 1px solid #ccc; } + div.table-wrapper div.scrollable table { margin-left: 35%; } + div.table-wrapper div.scrollable { overflow: scroll; overflow-y: hidden; } + + table.responsive td, table.responsive th { position: relative; white-space: nowrap; overflow: hidden; } + table.responsive th:first-child, table.responsive td:first-child, table.responsive td:first-child, table.responsive.pinned td { display: none; } + +} + +/* ----------------------------------------- + Page Name 1 +----------------------------------------- */ + + + + +/* ----------------------------------------- + Page Name 2 +----------------------------------------- */ + +