From: Marcin Koziej Date: Mon, 12 Mar 2012 08:43:25 +0000 (+0100) Subject: Merge branch 'pretty' of https://github.com/fnp/wolnelektury into pretty X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/c7587605ff2117ff1004239f8ec0cbd024cdc4ab?hp=b609bf3ae5d77cc2bf6d90791a0d248e687f53d0 Merge branch 'pretty' of https://github.com/fnp/wolnelektury into pretty --- diff --git a/apps/api/handlers.py b/apps/api/handlers.py index fddff7407..0255c05c5 100644 --- a/apps/api/handlers.py +++ b/apps/api/handlers.py @@ -36,6 +36,9 @@ category_plural={} for k, v in category_singular.items(): category_plural[v] = k +book_tag_categories = ['author', 'epoch', 'kind', 'genre'] + + def read_tags(tags, allowed): """ Reads a path of filtering tags. @@ -88,49 +91,64 @@ class BookMediaHandler(BaseHandler): return MEDIA_BASE + media.file.url -class BookDetailHandler(BaseHandler): - """ Main handler for Book objects. +class BookDetails(object): + """Custom fields used for representing Books.""" + + @classmethod + def author(cls, book): + return ", ".join(t.name for t in book.tags.filter(category='author')) + + @classmethod + def href(cls, book): + """ Returns an URI for a Book in the API. """ + return API_BASE + reverse("api_book", args=[book.slug]) + + @classmethod + def url(cls, book): + """ Returns Book's URL on the site. """ + + return WL_BASE + book.get_absolute_url() + + @classmethod + def children(cls, book): + """ Returns all media for a book. """ + + return book.children.all() + + @classmethod + def media(cls, book): + """ Returns all media for a book. """ + + return book.media.all() + - Responsible for lists of Book objects - and fields used for representing Books. +class BookDetailHandler(BaseHandler, BookDetails): + """ Main handler for Book objects. + + Responsible for single Book details. """ allowed_methods = ['GET'] - fields = ['title', 'parent'] + Book.formats + [ - 'media', 'url'] + category_singular.keys() + fields = ['title', 'parent', 'children'] + Book.formats + [ + 'media', 'url'] + book_tag_categories @piwik_track - def read(self, request, slug): + def read(self, request, book): """ Returns details of a book, identified by a slug and lang. """ try: - return Book.objects.get(slug=slug) + return Book.objects.get(slug=book) except Book.DoesNotExist: return rc.NOT_FOUND -class AnonymousBooksHandler(AnonymousBaseHandler): +class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): """ Main handler for Book objects. - Responsible for lists of Book objects - and fields used for representing Books. - + Responsible for lists of Book objects. """ allowed_methods = ('GET',) model = Book - fields = ['href', 'title'] - - categories = set(['author', 'epoch', 'kind', 'genre']) - - @classmethod - def href(cls, book): - """ Returns an URI for a Book in the API. """ - return API_BASE + reverse("api_book", args=[book.slug]) - - @classmethod - def url(cls, book): - """ Returns Book's URL on the site. """ - - return WL_BASE + book.get_absolute_url() + fields = ['author', 'href', 'title', 'url'] @piwik_track def read(self, request, tags, top_level=False): @@ -142,13 +160,19 @@ class AnonymousBooksHandler(AnonymousBaseHandler): it's children are aren't. By default all books matching the tags are returned. """ - tags = read_tags(tags, allowed=self.categories) + try: + tags = read_tags(tags, allowed=book_tag_categories) + except ValueError: + return rc.NOT_FOUND + if tags: if top_level: books = Book.tagged_top_level(tags) return books if books else rc.NOT_FOUND else: books = Book.tagged.with_all(tags) + elif top_level: + books = Book.objects.filter(parent=None) else: books = Book.objects.all() @@ -158,18 +182,12 @@ class AnonymousBooksHandler(AnonymousBaseHandler): return rc.NOT_FOUND def create(self, request, tags, top_level=False): - return 'aaa' + return rc.FORBIDDEN - @classmethod - def media(self, book): - """ Returns all media for a book. """ - return book.media.all() - - -class BooksHandler(BaseHandler): +class BooksHandler(BookDetailHandler): model = Book - fields = ('slug', 'title') + fields = ['author', 'href', 'title', 'url'] anonymous = AnonymousBooksHandler def create(self, request, tags, top_level=False): @@ -184,6 +202,7 @@ class BooksHandler(BaseHandler): else: return rc.NOT_FOUND + # add categorized tags fields for Book def _tags_getter(category): @classmethod @@ -191,7 +210,7 @@ def _tags_getter(category): return book.tags.filter(category=category) return get_tags for plural, singular in category_singular.items(): - setattr(BooksHandler, plural, _tags_getter(singular)) + setattr(BookDetails, plural, _tags_getter(singular)) # add fields for files in Book def _file_getter(format): @@ -205,13 +224,29 @@ def _file_getter(format): return '' return get_file for format in Book.formats: - setattr(BooksHandler, format, _file_getter(format)) + setattr(BookDetails, format, _file_getter(format)) + +class TagDetails(object): + """Custom Tag fields.""" -class TagDetailHandler(BaseHandler): + @classmethod + def href(cls, tag): + """ Returns URI in the API for the tag. """ + + return API_BASE + reverse("api_tag", args=[category_plural[tag.category], tag.slug]) + + @classmethod + def url(cls, tag): + """ Returns URL on the site. """ + + return WL_BASE + tag.get_absolute_url() + + +class TagDetailHandler(BaseHandler, TagDetails): """ Responsible for details of a single Tag object. """ - fields = ['name', 'sort_key', 'description'] + fields = ['name', 'url', 'sort_key', 'description'] @piwik_track def read(self, request, category, slug): @@ -228,7 +263,7 @@ class TagDetailHandler(BaseHandler): return rc.NOT_FOUND -class TagsHandler(BaseHandler): +class TagsHandler(BaseHandler, TagDetails): """ Main handler for Tag objects. Responsible for lists of Tag objects @@ -237,7 +272,7 @@ class TagsHandler(BaseHandler): """ allowed_methods = ('GET',) model = Tag - fields = ['name', 'href'] + fields = ['name', 'href', 'url'] @piwik_track def read(self, request, category): @@ -255,26 +290,42 @@ class TagsHandler(BaseHandler): return rc.NOT_FOUND +class FragmentDetails(object): + """Custom Fragment fields.""" + @classmethod - def href(cls, tag): - """ Returns URI in the API for the tag. """ + def href(cls, fragment): + """ Returns URI in the API for the fragment. """ - return API_BASE + reverse("api_tag", args=[category_plural[tag.category], tag.slug]) + return API_BASE + reverse("api_fragment", + args=[fragment.book.slug, fragment.anchor]) + + @classmethod + def url(cls, fragment): + """ Returns URL on the site for the fragment. """ + + return WL_BASE + fragment.get_absolute_url() + + @classmethod + def themes(cls, fragment): + """ Returns a list of theme tags for the fragment. """ + + return fragment.tags.filter(category='theme') -class FragmentDetailHandler(BaseHandler): +class FragmentDetailHandler(BaseHandler, FragmentDetails): fields = ['book', 'anchor', 'text', 'url', 'themes'] @piwik_track - def read(self, request, slug, anchor): + def read(self, request, book, anchor): """ Returns details of a fragment, identified by book slug and anchor. """ try: - return Fragment.objects.get(book__slug=slug, anchor=anchor) + return Fragment.objects.get(book__slug=book, anchor=anchor) except Fragment.DoesNotExist: return rc.NOT_FOUND -class FragmentsHandler(BaseHandler): +class FragmentsHandler(BaseHandler, FragmentDetails): """ Main handler for Fragments. Responsible for lists of Fragment objects @@ -282,7 +333,7 @@ class FragmentsHandler(BaseHandler): """ model = Fragment - fields = ['book', 'anchor', 'href'] + fields = ['book', 'url', 'anchor', 'href'] allowed_methods = ('GET',) categories = set(['author', 'epoch', 'kind', 'genre', 'book', 'theme']) @@ -295,33 +346,16 @@ class FragmentsHandler(BaseHandler): books/book-slug/authors/an-author/themes/a-theme/ """ - tags = read_tags(tags, allowed=self.categories) + try: + tags = read_tags(tags, allowed=self.categories) + except ValueError: + return rc.NOT_FOUND fragments = Fragment.tagged.with_all(tags).select_related('book') if fragments.exists(): return fragments else: return rc.NOT_FOUND - @classmethod - def href(cls, fragment): - """ Returns URI in the API for the fragment. """ - - return API_BASE + reverse("api_fragment", - args=[fragment.book.slug, fragment.anchor]) - - @classmethod - def url(cls, fragment): - """ Returns URL on the site for the fragment. """ - - return WL_BASE + fragment.get_absolute_url() - - @classmethod - def themes(cls, fragment): - """ Returns a list of theme tags for the fragment. """ - - return fragment.tags.filter(category='theme') - - # Changes handlers diff --git a/apps/catalogue/migrations/0026_set_names.py b/apps/catalogue/migrations/0026_set_names.py new file mode 100644 index 000000000..837e4d034 --- /dev/null +++ b/apps/catalogue/migrations/0026_set_names.py @@ -0,0 +1,132 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + for tag in orm.Tag.objects.filter(category='set', name__contains=','): + tag.name = tag.name.replace(', ', ' ').replace(',', ' ') + tag.save() + + + def backwards(self, orm): + "Write your backwards methods here." + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'cover': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'extra_info': ('catalogue.fields.JSONField', [], {'default': "'{}'"}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'catalogue.bookmedia': { + 'Meta': {'ordering': "('type', 'name')", 'object_name': 'BookMedia'}, + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'media'", 'to': "orm['catalogue.Book']"}), + 'extra_info': ('catalogue.fields.JSONField', [], {'default': "'{}'"}), + 'file': ('catalogue.fields.OverwritingFileField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': "'100'"}), + 'source_sha1': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': "'100'"}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'catalogue.collection': { + 'Meta': {'ordering': "('title',)", 'object_name': 'Collection'}, + 'book_slugs': ('django.db.models.fields.TextField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'primary_key': 'True', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}) + }, + 'catalogue.fragment': { + 'Meta': {'ordering': "('book', 'anchor')", 'object_name': 'Fragment'}, + 'anchor': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'fragments'", 'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'short_text': ('django.db.models.fields.TextField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'catalogue.tag': { + 'Meta': {'ordering': "('sort_key',)", 'unique_together': "(('slug', 'category'),)", 'object_name': 'Tag'}, + 'book_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'category': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '120', 'db_index': 'True'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}) + }, + 'catalogue.tagrelation': { + 'Meta': {'unique_together': "(('tag', 'content_type', 'object_id'),)", 'object_name': 'TagRelation', 'db_table': "'catalogue_tag_relation'"}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'items'", 'to': "orm['catalogue.Tag']"}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['catalogue'] diff --git a/apps/catalogue/templatetags/catalogue_tags.py b/apps/catalogue/templatetags/catalogue_tags.py index 14ed64da8..e9b1610c8 100644 --- a/apps/catalogue/templatetags/catalogue_tags.py +++ b/apps/catalogue/templatetags/catalogue_tags.py @@ -45,6 +45,10 @@ def capfirst(text): except IndexError: return '' +@register.filter +def build_absolute_uri(uri, request): + return request.build_absolute_uri(uri) + @register.simple_tag def html_title_from_tags(tags): diff --git a/requirements.txt b/requirements.txt index a961c4d32..ecb07cca2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ django-rosetta>=0.5.3 django-maintenancemode>=0.9 django-piston django-jsonfield +django-allauth python-memcached piwik diff --git a/wolnelektury/context_processors.py b/wolnelektury/context_processors.py index 0cbf60513..fa8515ec5 100644 --- a/wolnelektury/context_processors.py +++ b/wolnelektury/context_processors.py @@ -1,6 +1,6 @@ +from django.conf import settings def extra_settings(request): - from django.conf import settings return { 'STATIC_URL': settings.STATIC_URL, } diff --git a/wolnelektury/settings.py b/wolnelektury/settings.py index a1ad8785c..7f22b0ce6 100644 --- a/wolnelektury/settings.py +++ b/wolnelektury/settings.py @@ -92,6 +92,8 @@ TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.request', 'wolnelektury.context_processors.extra_settings', 'search.context_processors.search_form', + "allauth.context_processors.allauth", + "allauth.account.context_processors.account", ) MIDDLEWARE_CLASSES = [ @@ -114,6 +116,12 @@ TEMPLATE_DIRS = [ path.join(PROJECT_DIR, 'templates'), ] + +AUTHENTICATION_BACKENDS = [ + 'django.contrib.auth.backends.ModelBackend', + 'allauth.account.auth_backends.AuthenticationBackend', +] +EMAIL_CONFIRMATION_DAYS = 2 LOGIN_URL = '/uzytkownicy/zaloguj/' LOGIN_REDIRECT_URL = '/' @@ -136,6 +144,16 @@ INSTALLED_APPS = [ 'djkombu', # 'django_nose', + #allauth stuff + 'emailconfirmation', + 'uni_form', + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'allauth.openid', + #'allauth.facebook', + #'allauth.twitter', + # included 'compress', 'modeltranslation', @@ -207,6 +225,13 @@ COMPRESS_CSS = { ], 'output_filename': 'css/all.min?.css', }, + 'screen': { + 'source_filenames': ['css/screen.css'], + 'output_filename': ['css/screen.min?.css'], + 'extra_context': { + 'media': 'screen and (min-width: 800px)', + }, + }, 'ie': { 'source_filenames': [ 'css/ie.css', @@ -279,17 +304,6 @@ COMPRESS_VERSION = True COMPRESS_CSS_FILTERS = None THUMBNAIL_QUALITY = 95 -THUMBNAIL_EXTENSION = 'png' - -THUMBNAIL_PROCESSORS = ( - # Default processors - 'sorl.thumbnail.processors.colorspace', - 'sorl.thumbnail.processors.autocrop', - 'sorl.thumbnail.processors.scale_and_crop', - 'sorl.thumbnail.processors.filters', - # Custom processors - 'sponsors.processors.add_padding', -) TRANSLATION_REGISTRY = "wolnelektury.translation" diff --git a/wolnelektury/static/css/base.css b/wolnelektury/static/css/base.css index 70aa172de..3160611e5 100755 --- a/wolnelektury/static/css/base.css +++ b/wolnelektury/static/css/base.css @@ -64,14 +64,6 @@ ul.plain { padding: 0; } -.left-column { - width: 47em; - float: left; -} -.right-column { - float:right; - width: 47em; -} .normal-text { font-size: 1.3em; line-height: 1.3em; @@ -125,13 +117,6 @@ h2 { box-shadow: 2px 2px 2px #ddd; } - -#header-content, div#main-content, div#half-header-content, #footer-content { - width: 97.5em; - margin: auto; -} - - .page-desc { margin-left: 1.5em; } @@ -175,7 +160,6 @@ h2 { column-width: 12em; -moz-column-width: 12em; -webkit-column-width: 12em; - width: 48em; } .hidden-box li { margin-bottom: .5em; diff --git a/wolnelektury/static/css/book_box.css b/wolnelektury/static/css/book_box.css index 876bf06b0..6b2806851 100755 --- a/wolnelektury/static/css/book_box.css +++ b/wolnelektury/static/css/book_box.css @@ -17,8 +17,6 @@ } .book-wide-box { - width: 97.5em; - /** This is a fullpage box, it must be aligned with the top menu. This corresponds to a .1em margin below **/ margin-left: -0.1em; @@ -60,16 +58,11 @@ min-height: 24.4em; } -.search-result { - width: 97.5em; -} - .search-result .book-box-body { width: 31em; } .book-list-header { - width: 97.5em; padding: 0em; margin-left: -0.1em; } @@ -202,6 +195,9 @@ font-size: 1.1em; } +.book-wide-box { + min-width: 48.75em; +} .book-wide-box .book-box-tools { margin-left: 14em; width: 32em; @@ -209,6 +205,7 @@ .book-wide-box #theme-list-wrapper { margin-left: 15.4em; + margin-bottom: 3em; width: 30em; } @@ -260,11 +257,6 @@ ul.book-box-tools { width: 7em; } -.book-wide-box .right-column { - float: right; - width: 41.5em; -} - ul.inline-items, ul.inline-items li { margin: 0; padding: 0; @@ -329,11 +321,6 @@ ul.inline-items li { display: none; } -.snippets { - width: 44em; - float: right; -} - .snippets .snippet-text { background: #f7f7f7; font-size: 1.2em; diff --git a/wolnelektury/static/css/catalogue.css b/wolnelektury/static/css/catalogue.css index 74338f877..0e952ba7d 100755 --- a/wolnelektury/static/css/catalogue.css +++ b/wolnelektury/static/css/catalogue.css @@ -14,15 +14,12 @@ } -#tagged-object-list .left-column, #tagged-object-list .right-column { - width: 48em; -} - - /* listing of all books */ #book-list { padding-left: 50px; } +/* FIXME: MEDIA? + * #book-list-nav { position: absolute; right: 50px; @@ -31,6 +28,7 @@ padding: 10px; font-size: 1.2em; } + */ #book-list-nav ul { list-style-type: none; @@ -112,7 +110,6 @@ width: 7em; } .inline-body { - width: 35em; display: inline-block; vertical-align: top; margin-bottom: .5em; diff --git a/wolnelektury/static/css/cite.css b/wolnelektury/static/css/cite.css index 91c685138..69c28a7f2 100755 --- a/wolnelektury/static/css/cite.css +++ b/wolnelektury/static/css/cite.css @@ -26,13 +26,14 @@ #big-cite { - background-color: #bd9a89; /* average image color */ - color: white; + background-color: white; /* #bd9a89; /* average image color */ + color: black; padding: 0; margin: 0; background-image: url(/static/img/backdrop/horiavarlan-4268896468.jpg); background-size: 100%; background-position: 50% 70%; + background-repeat: no-repeat; } #big-cite .cite { @@ -49,7 +50,7 @@ #big-cite .cite-body { - margin: .05em .05em .05em 17.5em; + margin: .05em .05em .05em 1em; } #big-cite .cite-body span { font-size: 3em; @@ -57,9 +58,7 @@ } #big-cite .vip { - float:left; - text-align:right; - width: 14.7em; + margin-left: 1em; margin-top: .25em; } @@ -86,7 +85,7 @@ #big-cite .source { - margin: 1.6em 0.2em 1.6em 17.5em; + margin: 1.6em 0.2em 1.6em 1em; } #big-cite .source span { font-size: 1.2em; diff --git a/wolnelektury/static/css/dialogs.css b/wolnelektury/static/css/dialogs.css index d83116ba6..803c14d39 100755 --- a/wolnelektury/static/css/dialogs.css +++ b/wolnelektury/static/css/dialogs.css @@ -115,3 +115,14 @@ #custom-pdf-window label { display: inline; } + + +.socialauth { + margin: 1em 0; + padding: 0; +} +.socialauth li { + display: inline; + list-style: none; + margin-right: 1em; +} diff --git a/wolnelektury/static/css/header.css b/wolnelektury/static/css/header.css index 547e114a7..39d4160c5 100755 --- a/wolnelektury/static/css/header.css +++ b/wolnelektury/static/css/header.css @@ -7,7 +7,6 @@ } #header { - height: 3em; padding-top: 1.9em; padding-bottom: 0; color: #989898; @@ -27,17 +26,6 @@ } -#user-info { - float: right; - margin: 0; -} - -#logo { - position: absolute; - top: -1.6em; - margin-left: 1.5em; -} - #logo a { color:#f7f7f7; font-size: 2.05em; @@ -45,27 +33,30 @@ } #tagline { - display: inline-block; - margin-left: 25.5em; + margin-left: 1.5em; } + #tagline span { font-size: 1.3em; color: #bbb; } +#user-info { + margin: 0; + padding: 1em 0; + margin-left: 1.5em; +} + #search-area { margin: 0; background: #444; color: white; - margin-left: 24em; - width: 73.5em; } #search-field { display: inline-block; - width: 63.1em; padding-left: .5em; - padding-right: 0; + padding-right: .5em; padding-top: 0.5em; padding-bottom: 0; } @@ -84,7 +75,6 @@ -moz-box-shadow:0 0 .5em #444 inset; box-shadow: 0 0 .5em #444 inset;*/ height: 2.54em; - width: 47.47em; padding-left: 1em; -webkit-border-radius: .38em; -moz-border-radius: .38em; @@ -132,7 +122,6 @@ padding: 0; margin: 0; width: 9.4em; - float: right; } #search-button button { font-size: 1em; diff --git a/wolnelektury/static/css/logo.css b/wolnelektury/static/css/logo.css index c7e788299..611b4ba94 100644 --- a/wolnelektury/static/css/logo.css +++ b/wolnelektury/static/css/logo.css @@ -9,7 +9,9 @@ src: url(/static/fonts/WL.ttf) format("truetype"); } +#logo { + margin-left: 1.5em; +} #logo a { font-family: WL-Logo; - line-height: 7em; } diff --git a/wolnelektury/static/css/main_page.css b/wolnelektury/static/css/main_page.css index bc8e68fda..b564e825b 100755 --- a/wolnelektury/static/css/main_page.css +++ b/wolnelektury/static/css/main_page.css @@ -1,8 +1,6 @@ #promo-box { - float: right; width: 32em; - margin-top: -5.1em; } #promo-box-header { padding-top: 2em; @@ -19,7 +17,6 @@ #promo-box-body { border-bottom: 2px solid #efefef; padding: 2em 2.8em; - height: 30em; background: #efefef; } #promo-box-title { @@ -89,7 +86,7 @@ } .infopages-box .social-links a { - font-family: WL-Nav; + font-family: WL-Nav, courier; font-size: 3em; color: #281d1c; margin-right: .2em; diff --git a/wolnelektury/static/css/screen.css b/wolnelektury/static/css/screen.css new file mode 100644 index 000000000..3a344dc59 --- /dev/null +++ b/wolnelektury/static/css/screen.css @@ -0,0 +1,132 @@ +.left-column { + width: 47em; + float: left; +} +.right-column { + float:right; + width: 47em; +} + +.hidden-box ul { + width: 48em; +} + +#header-content, div#main-content, div#half-header-content, #footer-content { + width: 97.5em; + margin: auto; +} + +#promo-box { + float: right; + margin-top: -5.1em; +} + +#promo-box-body { + height: 30em; +} + +#big-cite .vip { + float:left; + text-align:right; + width: 14.7em; +} + +#big-cite .cite-body { + margin-left: 17.5em; +} + +#big-cite .source { + margin-left: 17.5em; +} + + +.book-wide-box { + width: 97.5em; +} +.book-wide-box .book-box-body { + width: 38.2em; +} + + +#tagged-object-list .left-column, #tagged-object-list .right-column { + width: 48em; +} + + + + +.inline-body { + width: 35em; +} + + +.search-result { + width: 97.5em; +} + + +.book-list-header { + width: 97.5em; +} + +.book-wide-box .right-column { + width: 41.5em; + margin-top: -23em; +} + +.book-wide-box #theme-list-wrapper { + margin-bottom: 0; +} + +.snippets { + width: 44em; + float: right; + margin-top: -20em; +} + +/* LOGO */ + +#logo a { + line-height: 7em; +} + + +/* HEADER */ + +#header { + height: 3em; +} + +#logo { + position: absolute; + top: -1.6em; +} + +#user-info { + float: right; + padding: 0 !important; + margin-left: 0; +} + +#tagline { + display: inline-block; + margin-left: 25.5em; +} + +#search-area { + margin-left: 24em; + width: 73.5em; +} + +#search-field { + width: 63.1em; + padding-right: 0 !important; +} + +#search { + width: 47.47em; +} + +#search-button { + float: right; +} diff --git a/wolnelektury/static/img/auth/google-icon.png b/wolnelektury/static/img/auth/google-icon.png new file mode 100644 index 000000000..d16d5313e Binary files /dev/null and b/wolnelektury/static/img/auth/google-icon.png differ diff --git a/wolnelektury/static/img/auth/google.png b/wolnelektury/static/img/auth/google.png new file mode 100644 index 000000000..bf7d11240 Binary files /dev/null and b/wolnelektury/static/img/auth/google.png differ diff --git a/wolnelektury/static/img/auth/openid-large.png?1237615666 b/wolnelektury/static/img/auth/openid-large.png?1237615666 new file mode 100644 index 000000000..6094fffec Binary files /dev/null and b/wolnelektury/static/img/auth/openid-large.png?1237615666 differ diff --git a/wolnelektury/static/img/auth/openid.png b/wolnelektury/static/img/auth/openid.png new file mode 100644 index 000000000..83e97691f Binary files /dev/null and b/wolnelektury/static/img/auth/openid.png differ diff --git a/wolnelektury/templates/auth/login.html b/wolnelektury/templates/auth/login.html new file mode 100644 index 000000000..553e873a0 --- /dev/null +++ b/wolnelektury/templates/auth/login.html @@ -0,0 +1,14 @@ +{% extends "ajaxable/form.html" %} +{% load i18n %} + +{% block extra %} + +

{% trans "or join accounts:" %}

+ + + +{% endblock %} + + diff --git a/wolnelektury/templates/auth/login_register.html b/wolnelektury/templates/auth/login_register.html index ecaeaf4a1..394902a2b 100755 --- a/wolnelektury/templates/auth/login_register.html +++ b/wolnelektury/templates/auth/login_register.html @@ -3,6 +3,12 @@ {% block extra %} +

{% trans "or join accounts:" %}

+ + +

{% trans "or register" %}:

diff --git a/wolnelektury/templates/base.html b/wolnelektury/templates/base.html index 554e6d39b..fac93191c 100644 --- a/wolnelektury/templates/base.html +++ b/wolnelektury/templates/base.html @@ -1,192 +1,4 @@ - - - {% load cache compressed i18n %} - {% load catalogue_tags reporting_stats sponsor_tags %} - - - - {% block title %}{% trans "Wolne Lektury" %} :: - {% block titleextra %}{% endblock %}{% endblock %} - - - {% compressed_css "all" %} - - - +{% extends "superbase.html" %} - {% block extrahead %} - {% endblock %} - - - {% block bodycontent %} - -
- - - -
-
- - - -
- -
- - {{search_form.q}} - -
- -
- -
-
- - - -
-
- - - -
- - - -
- - - - {% block body %} - {% endblock %} - - - - -
- -
{# end main-content #} - - - - - - - {# template #} -
- -
-

* {% trans "Loading" %}

-
-
- - - {% endblock bodycontent %} - - - - - {% compressed_js "base" %} - - - - +{% block ogtitle %}{% block titleextra %}{% endblock %}{% endblock %} diff --git a/wolnelektury/templates/catalogue/book_detail.html b/wolnelektury/templates/catalogue/book_detail.html index dd4d9078a..a996d66ee 100644 --- a/wolnelektury/templates/catalogue/book_detail.html +++ b/wolnelektury/templates/catalogue/book_detail.html @@ -1,8 +1,10 @@ {% extends "base.html" %} {% load cache i18n %} +{% load thumbnail %} {% load catalogue_tags pagination_tags %} {% block titleextra %}{{ book.pretty_title }}{% endblock %} +{% block ogimage %}{{ book.cover.url|build_absolute_uri:request }}{% endblock %} {% block metadescription %}{% book_title book %}. {{ block.super }}{% endblock %} diff --git a/wolnelektury/templates/catalogue/book_short.html b/wolnelektury/templates/catalogue/book_short.html index 77e775ed3..3541d0f74 100644 --- a/wolnelektury/templates/catalogue/book_short.html +++ b/wolnelektury/templates/catalogue/book_short.html @@ -16,8 +16,6 @@ " alt="Cover" /> {% endif %} - {% block right-column %} - {% endblock %}
@@ -106,6 +104,8 @@ {% block book-box-extra-info %}{% endblock %} {% block box-append %} {% endblock %} + {% block right-column %} + {% endblock %}
diff --git a/wolnelektury/templates/lesmianator/poem.html b/wolnelektury/templates/lesmianator/poem.html index 78c5d5fb3..5d44a26f9 100644 --- a/wolnelektury/templates/lesmianator/poem.html +++ b/wolnelektury/templates/lesmianator/poem.html @@ -20,9 +20,7 @@ Wolne Lektury przepuszczone przez mikser.

diff --git a/wolnelektury/templates/main_page.html b/wolnelektury/templates/main_page.html index 77dff582a..f92028fb3 100755 --- a/wolnelektury/templates/main_page.html +++ b/wolnelektury/templates/main_page.html @@ -3,6 +3,7 @@ {% block title %}{% trans "Wolne Lektury internet library" %}{% endblock %} +{% block ogtitle %}{% trans "Wolne Lektury internet library" %}{% endblock %} {% block body %} @@ -57,9 +58,9 @@

diff --git a/wolnelektury/templates/socialaccount/snippets/provider_list.html b/wolnelektury/templates/socialaccount/snippets/provider_list.html new file mode 100644 index 000000000..99e30a5c1 --- /dev/null +++ b/wolnelektury/templates/socialaccount/snippets/provider_list.html @@ -0,0 +1,21 @@ +{% load allauth_tags %} + +{% if allauth.openid_enabled %} +
  • + Google
  • +{% endif %} +{% if allauth.twitter_enabled %} +
  • +{% endif %} +{% if allauth.facebook_enabled %} +
  • +{% endif %} +{% if allauth.openid_enabled %} + + + +{% endif %} diff --git a/wolnelektury/templates/superbase.html b/wolnelektury/templates/superbase.html new file mode 100644 index 000000000..5813a2b7f --- /dev/null +++ b/wolnelektury/templates/superbase.html @@ -0,0 +1,201 @@ + + + {% load cache compressed i18n %} + {% load catalogue_tags reporting_stats sponsor_tags %} + + + + + + + + + {% block ogextra %}{% endblock %} + + + {% block title %}{% trans "Wolne Lektury" %} :: + {% block titleextra %}{% endblock %}{% endblock %} + + + {% compressed_css "all" %} + {% compressed_css "screen" %} + + + + + {% block extrahead %} + {% endblock %} + + + + {% block bodycontent %} + +
    + + + +
    +
    + + + +
    + +
    + + {{search_form.q}} + +
    + +
    + +
    +
    + + + +
    +
    + + + +
    + + + +
    + + + + {% block body %} + {% endblock %} + + + + +
    + +
    {# end main-content #} + + + + + + + {# template #} +
    + +
    +

    * {% trans "Loading" %}

    +
    +
    + + + {% endblock bodycontent %} + + + + + {% compressed_js "base" %} + + + + diff --git a/wolnelektury/urls.py b/wolnelektury/urls.py index f6cd8d927..36959904c 100644 --- a/wolnelektury/urls.py +++ b/wolnelektury/urls.py @@ -32,6 +32,7 @@ urlpatterns += patterns('', url(r'^raporty/', include('reporting.urls')), url(r'^info/', include('infopages.urls')), url(r'^ludzie/', include('social.urls')), + url(r'^uzytkownicy/', include('allauth.urls')), # Admin panel url(r'^admin/catalogue/book/import$', 'catalogue.views.import_book', name='import_book'), diff --git a/wolnelektury/views.py b/wolnelektury/views.py index c2624793b..bcead0317 100755 --- a/wolnelektury/views.py +++ b/wolnelektury/views.py @@ -27,6 +27,7 @@ def main_page(request): class LoginFormView(AjaxableFormView): form_class = AuthenticationForm + template = "auth/login.html" placeholdize = True title = _('Sign in') submit = _('Sign in')