From 676a568f5a13fd469699412c8b0b5381352a7380 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 7 Mar 2013 18:51:10 +0530 Subject: [PATCH] added blogger, updated style and blogs --- website/css/website.css | 19 +++- website/doctype/blog/blog.py | 7 ++ website/doctype/blog/blog.txt | 27 +++++- website/doctype/blogger/__init__.py | 0 website/doctype/blogger/blogger.py | 18 ++++ website/doctype/blogger/blogger.txt | 95 +++++++++++++++++++ .../style_settings/custom_template.css | 32 ++++++- .../doctype/style_settings/style_settings.js | 1 + .../doctype/style_settings/style_settings.py | 30 +++++- .../doctype/style_settings/style_settings.txt | 65 ++++++++++--- website/helpers/blog.py | 46 ++++----- website/page/website_home/website_home.js | 5 + website/templates/html/blog_page.html | 41 +++++--- website/templates/html/outer.html | 2 +- website/templates/js/blog.js | 28 ++++-- website/templates/pages/blog.html | 3 +- 16 files changed, 341 insertions(+), 78 deletions(-) create mode 100644 website/doctype/blogger/__init__.py create mode 100644 website/doctype/blogger/blogger.py create mode 100644 website/doctype/blogger/blogger.txt diff --git a/website/css/website.css b/website/css/website.css index a0f4e1b3ca..dc5b9670b3 100644 --- a/website/css/website.css +++ b/website/css/website.css @@ -1,9 +1,4 @@ div.outer { - -moz-box-shadow: 0px 0px 3px rgba(0,0,0,0.9); - -webkit-box-shadow: 0px 0px 3px rgba(0,0,0,0.9); - box-shadow: 0px 0px 3px rgba(0,0,0,0.9); - background-color: #fff; - border-radius: 5px; padding: 30px; margin: 30px -30px 10px -30px; min-height: 400px; @@ -24,6 +19,8 @@ footer { border: 0px; border-bottom: 1px solid #ddd; border-radius: 0px; + padding-right: 30px; + padding-left: 30px; } p, li { @@ -98,6 +95,18 @@ p, li { width: 30px; } +.avatar-medium { + margin-right: 5px; + width: 48px; + height: 48px; + border-radius: 48px; + -moz-border-radius: 48px; + -webkit-border-radius: 48px; +} +.avatar-medium img { + width: 48px; +} + .avatar-large { margin-right: 10px; width: 72px; diff --git a/website/doctype/blog/blog.py b/website/doctype/blog/blog.py index cfc0ca643e..2e96f4868b 100644 --- a/website/doctype/blog/blog.py +++ b/website/doctype/blog/blog.py @@ -27,6 +27,9 @@ class DocType: from website.utils import page_name self.doc.name = page_name(self.doc.title) + def validate(self): + self.doc.blog_intro = self.doc.blog_intro[:140] + def on_update(self): from website.utils import update_page_name update_page_name(self.doc, self.doc.title) @@ -66,6 +69,10 @@ class DocType: self.doc.full_name = get_fullname(self.doc.owner) self.doc.updated = global_date_format(self.doc.creation) self.doc.content_html = self.doc.content + if self.doc.blogger: + self.doc.blogger_info = webnotes.doc("blogger", self.doc.blogger).fields + if self.doc.blogger_info.avatar and not "/" in self.doc.blogger_info.avatar: + self.doc.blogger_info.avatar = "files/" + self.doc.blogger_info.avatar comment_list = webnotes.conn.sql("""\ select comment, comment_by_fullname, creation diff --git a/website/doctype/blog/blog.txt b/website/doctype/blog/blog.txt index af9606a71b..cdc7018f1e 100644 --- a/website/doctype/blog/blog.txt +++ b/website/doctype/blog/blog.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-25 11:35:09", "docstatus": 0, - "modified": "2013-02-21 16:54:04", + "modified": "2013-03-07 16:32:13", "modified_by": "Administrator", "owner": "Administrator" }, @@ -50,18 +50,37 @@ "label": "Published" }, { - "description": "Description for listing page, in plain text, only a couple of lines.", + "doctype": "DocField", + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, + { + "doctype": "DocField", + "fieldname": "blogger", + "fieldtype": "Link", + "label": "Blogger", + "options": "Blogger", + "reqd": 1 + }, + { + "doctype": "DocField", + "fieldname": "section_break_5", + "fieldtype": "Section Break" + }, + { + "description": "Description for listing page, in plain text, only a couple of lines. (max 140 characters)", "doctype": "DocField", "fieldname": "blog_intro", "fieldtype": "Small Text", - "label": "Blog Intro" + "label": "Blog Intro", + "reqd": 1 }, { "doctype": "DocField", "fieldname": "content", "fieldtype": "Text Editor", "label": "Content", - "reqd": 0 + "reqd": 1 }, { "doctype": "DocField", diff --git a/website/doctype/blogger/__init__.py b/website/doctype/blogger/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/website/doctype/blogger/blogger.py b/website/doctype/blogger/blogger.py new file mode 100644 index 0000000000..28d0f29b3e --- /dev/null +++ b/website/doctype/blogger/blogger.py @@ -0,0 +1,18 @@ +# For license information, please see license.txt + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl + + def on_update(self): + "if profile is set, then update all older blogs" + if self.doc.profile: + for blog in webnotes.conn.sql_list("""select name from tabBlog where owner=%s + and ifnull(blogger,'')=''""", self.doc.profile): + b = webnotes.bean("Blog", blog) + b.blogger = self.doc.name + b.save() + diff --git a/website/doctype/blogger/blogger.txt b/website/doctype/blogger/blogger.txt new file mode 100644 index 0000000000..01e0ceae20 --- /dev/null +++ b/website/doctype/blogger/blogger.txt @@ -0,0 +1,95 @@ +[ + { + "creation": "2013-03-07 16:28:19", + "docstatus": 0, + "modified": "2013-03-07 16:33:37", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "allow_attach": 1, + "autoname": "field:short_name", + "description": "Profile of a Blogger", + "doctype": "DocType", + "document_type": "Master", + "max_attachments": 1, + "module": "Website", + "name": "__common__" + }, + { + "doctype": "DocField", + "name": "__common__", + "parent": "Blogger", + "parentfield": "fields", + "parenttype": "DocType", + "permlevel": 0 + }, + { + "doctype": "DocPerm", + "name": "__common__", + "parent": "Blogger", + "parentfield": "permissions", + "parenttype": "DocType", + "permlevel": 0, + "read": 1, + "write": 1 + }, + { + "doctype": "DocType", + "name": "Blogger" + }, + { + "description": "Will be used in url (usually first name).", + "doctype": "DocField", + "fieldname": "short_name", + "fieldtype": "Data", + "label": "Short Name", + "reqd": 1 + }, + { + "doctype": "DocField", + "fieldname": "full_name", + "fieldtype": "Data", + "label": "Full Name", + "reqd": 1 + }, + { + "doctype": "DocField", + "fieldname": "profile", + "fieldtype": "Link", + "label": "Profile", + "options": "Profile" + }, + { + "doctype": "DocField", + "fieldname": "bio", + "fieldtype": "Small Text", + "label": "Bio" + }, + { + "doctype": "DocField", + "fieldname": "avatar", + "fieldtype": "Select", + "label": "Avatar", + "options": "attach_files:" + }, + { + "doctype": "DocField", + "fieldname": "file_list", + "fieldtype": "Text", + "hidden": 1, + "label": "File List", + "no_copy": 1, + "print_hide": 1 + }, + { + "create": 1, + "doctype": "DocPerm", + "role": "Website Manager" + }, + { + "doctype": "DocPerm", + "match": "owner:profile", + "role": "Blogger" + } +] \ No newline at end of file diff --git a/website/doctype/style_settings/custom_template.css b/website/doctype/style_settings/custom_template.css index 52897447bd..d5283ffbce 100644 --- a/website/doctype/style_settings/custom_template.css +++ b/website/doctype/style_settings/custom_template.css @@ -1,3 +1,7 @@ +{% if doc.at_import %} +{{ doc.at_import }} +{% endif %} + body { {% if doc.background_image %} background: url("../files/{{ doc.background_image }}") repeat; @@ -7,8 +11,8 @@ body { {% else %} background-color: #edede7; {% endif %} -{% if doc.font %} - font-family: '{{ doc.font }}', Verdana, Sans !important; +{% if doc.font or doc.google_web_font_for_text %} + font-family: '{{ doc.google_web_font_for_text or doc.font }}', Verdana, Sans !important; {% endif %} {% if doc.font_size %} font-size: {{ doc.font_size }} !important; @@ -21,14 +25,32 @@ body { } {% endif %} -{% if doc.heading_font %} +div.outer { + background-color: #{{ doc.page_background or "fff" }}; +} + +{% if doc.google_web_font_for_heading or doc.heading_font %} h1, h2, h3, h4, h5 { - font-family: '{{ doc.heading_font}}', Arial, 'Helvetica Neue' !important; + font-family: '{{ doc.google_web_font_for_heading or doc.heading_font }}', Arial, 'Helvetica Neue' !important; } {% endif %} -/* Bootstrap Navbar */ +{% if doc.page_border %} +/* Page Border*/ +div.outer { + -moz-box-shadow: 0px 0px 3px rgba(0,0,0,0.9); + -webkit-box-shadow: 0px 0px 3px rgba(0,0,0,0.9); + box-shadow: 0px 0px 3px rgba(0,0,0,0.9); + border-radius: 5px; +} +{% else %} +div.web-footer { + border-top: 1px solid #eee; + padding-top: 10px; +} +{% endif %} +/* Bootstrap Navbar */ .navbar-inverse .navbar-inner { background-color: #{{ doc.top_bar_background or "444"}}; background-repeat: repeat-x; diff --git a/website/doctype/style_settings/style_settings.js b/website/doctype/style_settings/style_settings.js index 6a17db99ee..e8ee908799 100644 --- a/website/doctype/style_settings/style_settings.js +++ b/website/doctype/style_settings/style_settings.js @@ -18,6 +18,7 @@ cur_frm.cscript.onload_post_render = function() { wn.require('lib/public/js/lib/jscolor/jscolor.js'); cur_frm.fields_dict.background_color.input.className = 'color'; + cur_frm.fields_dict.page_background.input.className = 'color'; cur_frm.fields_dict.top_bar_background.input.className = 'color'; jscolor.bind(); } \ No newline at end of file diff --git a/website/doctype/style_settings/style_settings.py b/website/doctype/style_settings/style_settings.py index 51799483d4..95bba74182 100644 --- a/website/doctype/style_settings/style_settings.py +++ b/website/doctype/style_settings/style_settings.py @@ -29,10 +29,7 @@ class DocType: 'custom_template.css'), 'r') as f: temp = Template(f.read()) - if not self.doc.font_size: - self.doc.font_size = '13px' - - self.doc.small_font_size = str(int(self.doc.font_size[:-2])-2) + 'px' + self.prepare() self.doc.custom_css = temp.render(doc = self.doc) if self.doc.add_css: @@ -41,7 +38,30 @@ class DocType: from webnotes.sessions import clear_cache clear_cache('Guest') - del self.doc.fields['small_font_size'] + for f in ["small_font_size", "at_import"]: + if f in self.doc.fields: + del self.doc.fields[f] + + def prepare(self): + if not self.doc.font_size: + self.doc.font_size = '13px' + + self.doc.small_font_size = str(int(self.doc.font_size[:-2])-2) + 'px' + self.doc.page_border = int(self.doc.page_border) + + fonts = [] + if self.doc.google_web_font_for_heading: + fonts.append(self.doc.google_web_font_for_heading) + if self.doc.google_web_font_for_text: + fonts.append(self.doc.google_web_font_for_text) + + fonts = list(set(fonts)) + + self.doc.at_import = "" + for f in fonts: + self.doc.at_import += "\n@import url(http://fonts.googleapis.com/css?family=%s);" % f.replace(" ", "+") + + def on_update(self): """rebuild pages""" diff --git a/website/doctype/style_settings/style_settings.txt b/website/doctype/style_settings/style_settings.txt index 0063ba975e..ebdc35a181 100644 --- a/website/doctype/style_settings/style_settings.txt +++ b/website/doctype/style_settings/style_settings.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-25 11:35:10", "docstatus": 0, - "modified": "2013-03-07 14:46:51", + "modified": "2013-03-07 16:06:22", "modified_by": "Administrator", "owner": "Administrator" }, @@ -38,6 +38,12 @@ "doctype": "DocType", "name": "Style Settings" }, + { + "doctype": "DocField", + "fieldname": "color", + "fieldtype": "Section Break", + "label": "Color" + }, { "description": "If image is selected, color will be ignored (attach first)", "doctype": "DocField", @@ -53,6 +59,25 @@ "fieldtype": "Data", "label": "Background Color" }, + { + "doctype": "DocField", + "fieldname": "page_background", + "fieldtype": "Data", + "label": "Page Background" + }, + { + "doctype": "DocField", + "fieldname": "page_border", + "fieldtype": "Check", + "label": "Page Border" + }, + { + "doctype": "DocField", + "fieldname": "cb0", + "fieldtype": "Column Break", + "print_width": "50%", + "width": "50%" + }, { "doctype": "DocField", "fieldname": "top_bar_background", @@ -69,31 +94,49 @@ }, { "doctype": "DocField", - "fieldname": "cb0", - "fieldtype": "Column Break", - "print_width": "50%", - "width": "50%" + "fieldname": "fonts", + "fieldtype": "Section Break", + "label": "Fonts" + }, + { + "doctype": "DocField", + "fieldname": "heading_font", + "fieldtype": "Select", + "label": "Font (Heading)", + "options": "\nHelvetica Neue\nLucida Grande\nVerdana\nArial\nGeorgia\nTahoma\nLato\nOpen Sans" }, { "doctype": "DocField", "fieldname": "font", "fieldtype": "Select", - "label": "Font", + "label": "Font (Text)", "options": "\nHelvetica Neue\nLucida Grande\nVerdana\nArial\nGeorgia\nTahoma" }, { "doctype": "DocField", "fieldname": "font_size", "fieldtype": "Select", - "label": "Font Size", + "label": "Font Size (Text)", "options": "\n12px\n13px\n14px\n15px\n16px" }, { "doctype": "DocField", - "fieldname": "heading_font", - "fieldtype": "Select", - "label": "Heading Font", - "options": "\nHelvetica Neue\nLucida Grande\nVerdana\nArial\nGeorgia\nTahoma\nLato\nOpen Sans" + "fieldname": "column_break_13", + "fieldtype": "Column Break" + }, + { + "description": "Add the name of Google Web Font e.g. \"Open Sans\"", + "doctype": "DocField", + "fieldname": "google_web_font_for_heading", + "fieldtype": "Data", + "label": "Google Web Font (Heading)" + }, + { + "description": "Add the name of Google Web Font e.g. \"Open Sans\"", + "doctype": "DocField", + "fieldname": "google_web_font_for_text", + "fieldtype": "Data", + "label": "Google Web Font (Text)" }, { "doctype": "DocField", diff --git a/website/helpers/blog.py b/website/helpers/blog.py index 2bff6e5708..dcb15cbd17 100644 --- a/website/helpers/blog.py +++ b/website/helpers/blog.py @@ -6,39 +6,39 @@ import webnotes import website.utils @webnotes.whitelist(allow_guest=True) -def get_blog_list(args=None): - """ - args = { - 'start': 0, - } - """ +def get_blog_list(start=0, by=None): import webnotes - - if not args: args = webnotes.form_dict - + condition = "" + if by: + condition = " and t1.blogger='%s'" % by.replace("'", "\'") query = """\ select - name, page_name, content, owner, creation as creation, - title, (select count(name) from `tabComment` where - comment_doctype='Blog' and comment_docname=`tabBlog`.name) as comments - from `tabBlog` - where ifnull(published,0)=1 + t1.title, t1.name, t1.page_name, t1.creation as creation, + ifnull(t1.blog_intro, t1.content) as content, + t2.full_name, t2.avatar, t1.blogger, + (select count(name) from `tabComment` where + comment_doctype='Blog' and comment_docname=t1.name) as comments + from `tabBlog` t1, `tabBlogger` t2 + where ifnull(t1.published,0)=1 + and t1.blogger = t2.name + %(condition)s order by creation desc, name asc - limit %s, 5""" % args.start + limit %(start)s, 5""" % {"start": start, "condition": condition} - result = webnotes.conn.sql(query, args, as_dict=1) + result = webnotes.conn.sql(query, as_dict=1) # strip html tags from content import webnotes.utils for res in result: from webnotes.utils import global_date_format, get_fullname - res['full_name'] = get_fullname(res['owner']) res['published'] = global_date_format(res['creation']) if not res['content']: res['content'] = website.utils.get_html(res['page_name']) - res['content'] = split_blog_content(res['content']) - + res['content'] = res['content'][:140] + if res.avatar and not "/" in res.avatar: + res.avatar = "files/" + res.avatar + return result @webnotes.whitelist(allow_guest=True) @@ -115,10 +115,4 @@ def get_blog_content(blog_page_name): import webnotes.utils content = webnotes.utils.escape_html(content) return content - -def split_blog_content(content): - content = content.split("") - content = len(content) > 1 and content[1] or content[0] - content = content.split("") - content = content[0] - return content \ No newline at end of file + \ No newline at end of file diff --git a/website/page/website_home/website_home.js b/website/page/website_home/website_home.js index c6b2253df1..d770586070 100644 --- a/website/page/website_home/website_home.js +++ b/website/page/website_home/website_home.js @@ -21,6 +21,11 @@ wn.module_page["Website"] = [ description: wn._("Embed image slideshows in website pages."), doctype:"Website Slideshow" }, + { + label: wn._("Blogger"), + description: wn._("Profile of a blog writer."), + doctype:"Blogger" + }, ] }, { diff --git a/website/templates/html/blog_page.html b/website/templates/html/blog_page.html index 24dd8d7acc..6f7796b0b6 100644 --- a/website/templates/html/blog_page.html +++ b/website/templates/html/blog_page.html @@ -13,17 +13,33 @@

{{ title }}

-
By {{ full_name }} on {{ updated }}
+
+ {{ blogger_info and blogger_info.full_name or full_name }} wrote this on {{ updated }}

{{ content_html }} - + {% if blogger_info %} +
+
+
+
+ +
+
+
+

{{ blogger_info.full_name }}

+

{{ blogger_info.bio }}

+

+ All posts by {{ blogger_info.full_name }}

+
+
+ {% endif %}

Comments


{% if not comment_list %} -
+

Be the first one to comment

{% endif %} @@ -32,22 +48,19 @@
+
+ Show posts by everyone

{% endblock %} \ No newline at end of file diff --git a/website/templates/html/outer.html b/website/templates/html/outer.html index a8b73ad122..ab6a69eb23 100644 --- a/website/templates/html/outer.html +++ b/website/templates/html/outer.html @@ -10,7 +10,7 @@