[Hejes-devel] [877] blog: many new features

hejes-devel at nytud.hu hejes-devel at nytud.hu
Tue Jul 30 18:01:08 CEST 2013


Revision: 877
Author:   mihaltz
Date:     2013-07-30 18:01:08 +0200 (Tue, 30 Jul 2013)
Log Message:
-----------
blog: many new features

Modified Paths:
--------------
    trunk/misc/dbblog/Makefile
    trunk/misc/dbblog/test.py
    trunk/web2py/applications/helyesiras_webdev/controllers/blog.py
    trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_posts.table
    trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_tags.table
    trunk/web2py/applications/helyesiras_webdev/databases/sql.log
    trunk/web2py/applications/helyesiras_webdev/models/dbblog.py
    trunk/web2py/applications/helyesiras_webdev/modules/util.py
    trunk/web2py/applications/helyesiras_webdev/views/blog/index.html
    trunk/web2py/applications/helyesiras_webdev/views/blog/show.html
    trunk/web2py/applications/helyesiras_webdev/views/layout.html

Modified: trunk/misc/dbblog/Makefile
===================================================================
--- trunk/misc/dbblog/Makefile	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/misc/dbblog/Makefile	2013-07-30 16:01:08 UTC (rev 877)
@@ -8,6 +8,11 @@
 create_db:
 	mysql -u root -p < dbblog_create_database.sql
 
+# recreate DB: drop & create
+recreate_db:
+	( echo "drop database dbhelyesblog;" ; cat dbblog_create_database.sql ) | mysql -u root -p
+
+
 # create DB users
 create_dbusers:
 	mysql -u root -p < dbblog_create_users.sql

Modified: trunk/misc/dbblog/test.py
===================================================================
--- trunk/misc/dbblog/test.py	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/misc/dbblog/test.py	2013-07-30 16:01:08 UTC (rev 877)
@@ -19,6 +19,8 @@
 from gluon import *
 from gluon.dal import Row
 
+sys.path.append('../../web2py/applications/helyesiras_webdev/modules')
+import util
 
 db = DAL("mysql://dbblogadmin:d4bl0GGr@localhost/dbhelyesblog")
 # location of .table files = ???
@@ -34,7 +36,8 @@
     )
 
   db.define_table('tags',
-    Field('name', unique=True)
+    Field('name', unique=True),
+    Field('posts', 'list:reference posts')
     )
 
   db.define_table('categories',
@@ -46,7 +49,7 @@
     Field('title'), 
     Field('image', 'reference images'),
     Field('body', 'text'), 
-    Field('tags', 'list:reference tags'),
+    Field('tags', 'list:string'),
     Field('category', 'reference categories'),
     Field('created_on', 'datetime') # TODO add in webpy: default=request.now),
     )    
@@ -75,13 +78,9 @@
 
 def create_indexes():
   """Create indexes (if they didn't exist) on frequently used columns. Note: tables must already exist (otherwise raises exception)."""
-  #db.executesql('CREATE UNIQUE INDEX idx_images_title ON images (title);')
   create_index_if_not_exists(db, 'images', 'idx_images_title', 'title', True)
-  #db.executesql('CREATE UNIQUE INDEX idx_tags_name ON tags (name);')
   create_index_if_not_exists(db, 'tags', 'idx_tags_name', 'name', True)
-  #db.executesql('CREATE UNIQUE INDEX idx_categories_name ON categories (name);')  
   create_index_if_not_exists(db, 'categories', 'idx_categories_name', 'name', True)
-  #db.executesql('CREATE INDEX idx_posts_created_on ON posts (created_on);')  
   create_index_if_not_exists(db, 'posts', 'idx_posts_created_on', 'created_on')
   db.commit()
 
@@ -94,15 +93,14 @@
 
 def add_test_data():
   db.categories.bulk_insert([{'name': 'Hírek'}, {'name': 'Közönségszolgálat'}, {'name': 'Helyesírási érdekességek'}])
-  db.tags.bulk_insert([{'name': 'Új verzió'}, {'name': 'Hibajavítás'}, {'name': 'Különírás-egybeírás'}, {'name': 'Teszt'}])
   now = datetime.datetime.now()
   db.posts.insert(
     slug='elindult-a-blog',
     title='Elindult a blog',
-    body='#Elindult a blog\n\nEnnek *nagyon* örülünk.',
+    body="Ez itt az **első** bekezdés.\n\nEz pedig a ''második''.",
     created_on=now.strftime('%Y-%m-%d %H:%M:%S'),
     category=db.categories(name='Hírek').id,
-    tags=[db.tags(name='Új verzió').id]
+    tags=['új verzió']
     )
   db.posts.insert(
     slug='teszt-bejegyzes',
@@ -110,7 +108,7 @@
     body='Ez egy teszt bejegyzés.',
     created_on=(now + datetime.timedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S'),
     category=db.categories(name='Közönségszolgálat').id,
-    tags=[db.tags(name='Teszt').id]
+    tags=['teszt']
     )
   db.posts.insert(
     slug='teszt-bejegyzes-2',
@@ -118,19 +116,34 @@
     body='Ez is egy teszt bejegyzés.',
     created_on=(now + datetime.timedelta(minutes=2)).strftime('%Y-%m-%d %H:%M:%S'),
     category=db.categories(name='Helyesírási érdekességek').id,
-    tags=[db.tags(name='Teszt').id, db.tags(name='Különírás-egybeírás').id]
+    tags=['teszt', 'különírás-egybeírás']
     )
   db.posts.insert(
     slug='fekete-rigo-sarga-rigo',
     title='Fekete, sárga: rigó?',
-    body='Hogy kell írni őket? Olvasson tovább, kiderül.',
+    body='Hogy kell írni őket? A franc se tudja.',
     created_on=(now + datetime.timedelta(minutes=3)).strftime('%Y-%m-%d %H:%M:%S'),
     category=db.categories(name='Helyesírási érdekességek').id,
-    tags=[db.tags(name='Teszt').id, db.tags(name='Különírás-egybeírás').id]
+    tags=['teszt', 'tulajdonnevek']
     )
   db.commit()
 
 
+def regenerate_tags_table():
+  """Truncate table tags and generate its contents from table posts (using column tags)"""
+  db.tags.truncate()
+  data = {} # {tag: [post_ids], ...}
+  for row in db().select(db.posts.ALL):
+    for tag in row.tags:
+      if tag not in data:
+        data[tag] = [row.id]
+      else:
+        data[tag].append(row.id)
+  for tag in data:
+    db.tags.insert(name=tag, posts=data[tag])
+  db.commit()
+
+
 def some_test():
   print(db(db.categories.name=='Szolgálati közlemények').select()[0].id)
   print(db.categories(name='Szolgálati közlemények').id)
@@ -146,188 +159,24 @@
   rows = db(db.posts.category==db.categories.id).select(orderby=~db.posts.created_on, limitby=(0, 5))
   for row in rows:
     #print row
-    print(row.posts['title'], row.categories['name'])
+    print(row.posts['title'], row.categories['name'], util.pretty_hu_date(row.posts.created_on).encode('utf8'))
 
 
+def query_post():
+  slug='fekete-rigo-sarga-rigo'
+  #post = db((db.posts.category==db.categories.id) & (db.posts.slug==slug)).select()
+  post = db( (db.posts.category==db.categories.id) & (db.posts.slug==slug)).select( 
+             left=db.images.on(db.posts.image==db.images.id) )
+  print(len(post))
+  print(post)
 
 
+def query_posts_tag():
+  tag='tulajdonnevek'
+  posts = db(db.posts.tags.contains(tag)).select(db.posts.ALL)
+  print(posts)
 
 
-# LEGACY:
-
-
-# dump table and fields and types
-def dump_tables():
-  for table in db.tables:
-    print table + ':'
-    for field in db[table].fields:
-      print '  ' + field + ': ' + str(db[table][field].type)
-  print('')
-
-# Deletes all tables when new database csv file needs to be imported
-def dropdb():
-  for table_name in db.tables():
-    db[table_name].drop()
-  define_tables()
-
-# tests
-def test_add_data():
-  prof = []
-  prof.append( db.hqa_prof_cat_names.insert(name='filo') )
-  prof.append( db.hqa_prof_cat_names.insert(name='bio') )
-  db.hqa_main.insert(qword='alma', answer='alma!', prof_cat_ids=prof)
-
-def test_query0():
-  rows = db(db.hqa_main).select()
-  for row in rows:
-    print row
-
-def test_query1():
-  # 1-to-many
-  prof = []
-  prof.append( db.hqa_prof_cat_names.insert(name='filo') )
-  prof.append( db.hqa_prof_cat_names.insert(name='bio') )
-  db.hqa_main.insert(qword='alma', answer='alma!', prof_cat_ids=prof)
-  db.hqa_main.prof_cat_ids.represent = lambda ids: [db.hqa_prof_cat_names(x).name for x in ids]
-  #rows = db(db.hqa_main.prof_cat_ids.contains(prof[0])).select()
-  rows = db(db.hqa_main.prof_cat_ids.contains( 1 )).select()
-  for row in rows:
-    print row
-    print row.id, row.qword, db.hqa_main.prof_cat_ids.represent(row.prof_cat_ids)
-  #print db.hqa_prof_cat_names(1)
-
-def test_query2():
-  # inner join
-  i = db.hqa_prob_cat_names.insert(name='Hangjeloles')
-  db.hqa_main.insert(qword='alma', answer='alma!', prob_cat_id=i)
-  rows = db(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id).select()
-  for row in rows:
-    print row
-    print row.hqa_main.id, row.hqa_main.qword, row.hqa_main.answer, row.hqa_prob_cat_names.name
-
-def test_query3():
-  # inner join
-  rows = db(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id).select(limitby=(0, 10))
-  for row in rows:
-    print '; '.join([str(row.hqa_main.id), row.hqa_main.qword, row.hqa_main.answer, row.hqa_prob_cat_names.name])
-
-def test_query4():
-  # inner join
-  i = db.hqa_prob_cat_names.insert(name='Hangjeloles')
-  db.hqa_main.insert(qword='alma', answer='alma!', prob_cat_id=i)
-  db.hqa_main.insert(qword='barack', answer='barack!', prob_cat_id=None)  
-  rows = db(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id).select()
-  for row in rows:
-    print row
-    print row.hqa_main.id, row.hqa_main.qword, row.hqa_main.answer, row.hqa_prob_cat_names.name
-
-def test_query5():
-  # left outer join
-  i = db.hqa_prob_cat_names.insert(name='Hangjeloles')
-  db.hqa_main.insert(qword='alma', answer='alma!', prob_cat_id=i)
-  db.hqa_main.insert(qword='barack', answer='barack!', prob_cat_id=None)  
-  rows = db().select(db.hqa_main.ALL, db.hqa_prob_cat_names.ALL, left=db.hqa_prob_cat_names.on(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id))
-  for row in rows:
-    print row
-    print row.hqa_main.id, row.hqa_main.qword, row.hqa_main.answer, row.hqa_prob_cat_names.name
-
-def test_query6():
-  # left outer join
-  rows = db().select(db.hqa_main.ALL, db.hqa_prob_cat_names.ALL, left=db.hqa_prob_cat_names.on(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id), limitby=(0, 50))
-  for row in rows:
-    print '; '.join([str(row.hqa_main.id), row.hqa_main.qword, row.hqa_main.answer, row.hqa_prob_cat_names.name])
-
-def test_update():
-  # insert + select + update
-  i = db.hqa_main.insert(qword='alma', answer='alma!')
-  row = db.hqa_main(i) # same as: row = db(db.hqa_main.id==i).select().first()
-  print row
-  row.prof_cat_ids = [1,2]
-  row.update_record()
-  print row
-  row.prof_cat_ids.append(3)
-  row.update_record()
-  print row
-  db.commit()
-  
-def test_query7():
-  # select: empty result set
-  row = db.hqa_main(11111)
-  print row == None
-  print row
-  
-def test_query8():
-  # select w/ left join + 1-to-many
-  db.hqa_main.prof_cat_ids.represent = lambda ids: [db.hqa_prof_cat_names(x).name for x in ids]
-  db.hqa_main.remark_ids.represent = lambda ids: [db.hqa_remark_names(x).name for x in ids]
-  rows = db().select(db.hqa_main.ALL, db.hqa_prob_cat_names.ALL, left=db.hqa_prob_cat_names.on(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id), limitby=(0, 50))
-  for row in rows:
-    #print row
-    d = [row.hqa_main.id, row.hqa_main.qword, row.hqa_main.question, row.hqa_main.answer, row.hqa_prob_cat_names.name, 
-#        row.hqa_main.prof_cat_ids,
-         db.hqa_main.prof_cat_ids.represent(row.hqa_main.prof_cat_ids),
-#        row.hqa_main.remark_ids,
-         db.hqa_main.remark_ids.represent(row.hqa_main.remark_ids),
-         row.hqa_main.akh]
-    print '; '.join([str(x) for x in d])
-
-def test_query9():
-  # select w/ conditions + left join + 1-to-many
-  db.hqa_main.prof_cat_ids.represent = lambda ids: [db.hqa_prof_cat_names(x).name for x in ids]
-  db.hqa_main.remark_ids.represent = lambda ids: [db.hqa_remark_names(x).name for x in ids]
-  rows = db(db.hqa_main.qword.lower().contains(u'sajt')).select(db.hqa_main.ALL, db.hqa_prob_cat_names.ALL, left=db.hqa_prob_cat_names.on(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id), limitby=(0, 50))
-  for row in rows:
-    #print row
-    d = [row.hqa_main.id, row.hqa_main.qword, row.hqa_main.question, row.hqa_main.answer, row.hqa_prob_cat_names.name, 
-         db.hqa_main.prof_cat_ids.represent(row.hqa_main.prof_cat_ids),
-         db.hqa_main.remark_ids.represent(row.hqa_main.remark_ids),
-         row.hqa_main.akh]
-    print '; '.join([str(x) for x in d])
-
-def dump_main():
-  # select + left join + 1-to-many
-  db.hqa_main.prof_cat_ids.represent = lambda ids: [db.hqa_prof_cat_names(x).name for x in ids]
-  db.hqa_main.remark_ids.represent = lambda ids: [db.hqa_remark_names(x).name for x in ids]
-  rows = db().select(db.hqa_main.ALL, db.hqa_prob_cat_names.ALL, left=db.hqa_prob_cat_names.on(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id))
-  for row in rows:
-    #print row
-    d = [row.hqa_main.id, row.hqa_main.qword, row.hqa_main.question, row.hqa_main.answer, row.hqa_prob_cat_names.name, 
-         db.hqa_main.prof_cat_ids.represent(row.hqa_main.prof_cat_ids),
-         db.hqa_main.remark_ids.represent(row.hqa_main.remark_ids),
-         row.hqa_main.akh]
-    print '\t'.join([str(x) for x in d])
-
-
-def test_query10():
-  # select using dynamic query + left join + 1-to-many
-  db.hqa_main.prof_cat_ids.represent = lambda ids: [db.hqa_prof_cat_names(x).name for x in ids]
-  db.hqa_main.remark_ids.represent = lambda ids: [db.hqa_remark_names(x).name for x in ids]
-  # method#1
-  q = db.hqa_main.id > 0 # for starters: "select * from db.hqa_main" -- is this the best solution performance-wise??...
-  q &= db.hqa_main.qword.lower().contains(u'sajt')
-  #q &= db.hqa_main.prob_cat_id == 11
-  q &= db.hqa_main.prof_cat_ids.contains(25) # 'konyha'
-  print(q)
-  # method#2
-  qs = [db.hqa_main.id > 0]
-  qs.append( db.hqa_main.qword.lower().contains(u'sajt') )
-  qs.append( db.hqa_main.prof_cat_ids.contains(25) ) # 'konyha'
-  q = reduce( lambda x,y: x & y, qs )
-  print(q)
-  rows = db(q).select(db.hqa_main.ALL, db.hqa_prob_cat_names.ALL, left=db.hqa_prob_cat_names.on(db.hqa_main.prob_cat_id==db.hqa_prob_cat_names.id), limitby=(0, 50))
-  for row in rows:
-    #print row
-    d = [row.hqa_main.id, row.hqa_main.qword, row.hqa_main.question, row.hqa_main.answer, row.hqa_prob_cat_names.name, 
-         db.hqa_main.prof_cat_ids.represent(row.hqa_main.prof_cat_ids),
-         db.hqa_main.remark_ids.represent(row.hqa_main.remark_ids),
-         row.hqa_main.akh]
-    #r = Row(id=row.hqa_main.id)
-    #print r.id
-    print '\t'.join([str(x) for x in d])
-
-
-
-
 #########
 # main
 #########
@@ -336,7 +185,10 @@
 define_tables()
 #create_indexes()
 #add_test_data()
+#regenerate_tags_table()
+
 #query_categories()
 query_posts()
+#query_post()
+#query_posts_tag()
 
-

Modified: trunk/web2py/applications/helyesiras_webdev/controllers/blog.py
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/controllers/blog.py	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/controllers/blog.py	2013-07-30 16:01:08 UTC (rev 877)
@@ -9,18 +9,44 @@
   """Starting page for the blog.
      returns following keys:
      posts: Rows object with most recent 5 blog posts
-     categories: Rows object with category names and ids
-     tags: Rows object with tag names and ids
+     categories: Rows object with all category names and ids (for sidebar)
+     tags: Rows object with all tag names and ids (for sidebar)
      TODO:
      check GET vars (category, tag(s?)) and filter posts accordingly
   """
+  # all categories, tags for sidebar
   cats = dbblog().select(dbblog.categories.ALL, orderby=dbblog.categories.id)
   tags = dbblog().select(dbblog.tags.ALL, orderby=dbblog.tags.name)
-  posts = dbblog(dbblog.posts.category==dbblog.categories.id).select(orderby=~dbblog.posts.created_on, limitby=(0, 5))
+  # get posts (last 5, filtered by category or tag)
+  query = dbblog.posts.category == dbblog.categories.id
+  usercat = request.vars.get('category')
+  if usercat:
+    query &= (dbblog.categories.name == usercat)
+  usertag = request.vars.get('tag')
+  if usertag:
+    query &= (dbblog.posts.tags.contains(usertag))
+  # execute query
+  posts = dbblog(query).select(orderby=~dbblog.posts.created_on, limitby=(0, 5))
+  # return
   return dict(categories=cats, tags=tags, posts=posts)
 
 def show():
   """Show a selected blog post.
-     TODO
+     slug of post to show is passed as an unnamed argument with HTTP GET.
+     If no argumement is present, or if slug is not found in DB, redirect to index page (+flash message?)
+     Returns keys:
+     post: a Row object, first row from a combined select from posts, categories, tags, images
+     categories: Rows object with all category names and ids (for sidebar)
+     tags: Rows object with all tag names and ids (for sidebar)
   """
-  return dict()
+  cats = dbblog().select(dbblog.categories.ALL, orderby=dbblog.categories.id)
+  tags = dbblog().select(dbblog.tags.ALL, orderby=dbblog.tags.name)
+  slug = request.args(0)
+  if slug == None: # no arg: redirect to index
+    redirect(URL(c='blog', f='index'))
+  # query TODO: all tables all data as text
+  rows = dbblog( (dbblog.posts.category==dbblog.categories.id) & (dbblog.posts.slug==slug)).select( 
+                   left=dbblog.images.on(dbblog.posts.image==dbblog.images.id) )
+  if len(rows) == 0: # post not found: redirect to index
+    redirect(URL(c='blog', f='index')) # TODO: add message to flash as a var?
+  return dict(categories=cats, tags=tags, post=rows.first())

Modified: trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_posts.table
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_posts.table	2013-07-30 09:33:30 UTTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_posts.table	2013-07-30 16:01:08 UTC (rev 877)
@@ -88,7 +88,7 @@
 sg9
 I00
 sg10
-S'list:reference tags'
+S'list:string'
 p27
 ssS'slug'
 p28

Modified: trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_tags.table
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_tags.table	2013-07-30 09:33:30 UTCC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/databases/12731f961fce6b1f660fb9156944086a_tags.table	2013-07-30 16:01:08 UTC (rev 877)
@@ -1,5 +1,5 @@
 (dp1
-S'id'
+S'posts'
 p2
 (dp3
 S'length'
@@ -10,32 +10,49 @@
 I00
 sS'sortable'
 p6
-I1
+I3
 sS'sql'
 p7
-S'INT AUTO_INCREMENT NOT NULL'
+S'LONGTEXT'
 p8
 sS'notnull'
 p9
 I00
 sS'type'
 p10
-g2
-ssS'name'
+S'list:reference posts'
 p11
-(dp12
+ssS'id'
+p12
+(dp13
 g4
 I255
 sg5
+I00
+sg6
+I1
+sg7
+S'INT AUTO_INCREMENT NOT NULL'
+p14
+sg9
+I00
+sg10
+g12
+ssS'name'
+p15
+(dp16
+g4
+I255
+sg5
 I01
 sg6
 I2
 sg7
 S'VARCHAR(255) UNIQUE'
-p13
+p17
 sg9
 I00
 sg10
 S'string'
-p14
+p18
 ss.
\ No newline at end of file

Modified: trunk/web2py/applications/helyesiras_webdev/databases/sql.log
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/databases/sql.log	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/databases/sql.log	2013-07-30 16:01:08 UTC (rev 877)
@@ -125,3 +125,27 @@
     PRIMARY KEY(id)
 ) ENGINE=InnoDB CHARACTER SET utf8;
 success!
+timestamp: 2013-07-30T16:25:30.444596
+CREATE TABLE images(
+    id INT AUTO_INCREMENT NOT NULL,
+    file VARCHAR(255),
+    title VARCHAR(255) UNIQUE,
+    PRIMARY KEY(id)
+) ENGINE=InnoDB CHARACTER SET utf8;
+timestamp: 2013-07-30T16:26:01.650869
+CREATE TABLE images(
+    id INT AUTO_INCREMENT NOT NULL,
+    file VARCHAR(255),
+    title VARCHAR(255) UNIQUE,
+    PRIMARY KEY(id)
+) ENGINE=InnoDB CHARACTER SET utf8;
+timestamp: 2013-07-30T16:26:36.271767
+ALTER TABLE tags DROP COLUMN posts;
+success!
+timestamp: 2013-07-30T16:33:18.094824
+CREATE TABLE images(
+    id INT AUTO_INCREMENT NOT NULL,
+    file VARCHAR(255),
+    title VARCHAR(255) UNIQUE,
+    PRIMARY KEY(id)
+) ENGINE=InnoDB CHARACTER SET utf8;

Modified: trunk/web2py/applications/helyesiras_webdev/models/dbblog.py
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/models/dbblog.py	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/models/dbblog.py	2013-07-30 16:01:08 UTC (rev 877)
@@ -29,7 +29,8 @@
   )
 
 dbblog.define_table('tags',
-  Field('name', unique=True)
+  Field('name', unique=True),
+  Field('posts', 'list:reference posts')
   )
 
 dbblog.define_table('categories',
@@ -41,7 +42,7 @@
   Field('title'), 
   Field('image', 'reference images'),
   Field('body', 'text'), 
-  Field('tags', 'list:reference tags'),
+  Field('tags', 'list:string'),
   Field('category', 'reference categories'),
   Field('created_on', 'datetime', default=request.now)
   )    

Modified: trunk/web2py/applications/helyesiras_webdev/modules/util.py
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/modules/util.py	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/modules/util.py	2013-07-30 16:01:08 UTC (rev 877)
@@ -47,4 +47,11 @@
     return unicode(i, 'utf8', 'replace')
 
 
-
+def pretty_hu_date(d):
+  """Takes a datetime.datetime object and returns unicode string with pretty Hungarian format of date,
+     e.g. datetime.datetime(2013, 7, 30, 16, 42, 29) => u"2013. július 30. 16:42"
+  """
+  hn = [u'január', u'február', u'március', u'április', u'május', u'június', u'július', u'augusztus', u'szeptember', u'október', u'november', u'december']
+  return u'{0}. {1} {2}. {3}:{4}'.format(d.year, hn[d.month-1], d.day, d.hour, d.minute)
+  
+  

Modified: trunk/web2py/applications/helyesiras_webdev/views/blog/index.html
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/blog/index.html	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/views/blog/index.html	2013-07-30 16:01:08 UTC (rev 877)
@@ -1,32 +1,48 @@
 {{extend 'layout.html'}}
 
+{{from util import pretty_hu_date}}
 
 {{block blog_sidebar-first}}
   <div>Rovatok</div>
   {{for row in categories:}}
-    <div>{{=A(row['name'], _href=URL(c='blog', vars={'category': row['id']}))}}</div>
+    <div>
+      {{if request.vars.get('category') == row.name:}}
+        {{=row.name}}
+      {{else:}}
+        {{=A(row.name, _href=URL(c='blog', f='index', vars={'category': row.name}))}}
+      {{pass}}
+    </div>
   {{pass}}
   <div>Címkék</div>
   {{for row in tags:}}
-    <div>{{=A(row['name'], _href=URL(c='blog', vars={'tag': row['name']}))}}</div>
+    <div>
+      {{if request.vars.get('tag') == row.name:}}
+        {{='{0} ({1})'.format(row.name, len(row.posts))}}
+      {{else:}}
+        {{=A(row.name, _href=URL(c='blog', f='index', vars={'tag': row.name})) + ' ({0})'.format(len(row.posts))}}
+      {{pass}}
+    </div>
   {{pass}}
 {{end}}
 
 
+<div id="blog-container">
+
 {{=response.toolbar()}}
 
 <h1>Blog</h1>
 
-{{for i, post in enumerate(posts):}}
+{{for i, row in enumerate(posts):}}
   <div>
-    <div>{{=post.categories['name']}}</div>
-    <div>{{=post.posts['title']}}</div>
-    <div>{{=post.posts['created_on']}}</div>
-    <div>{{=post.posts['body']}}</div>
-    <div>{{=A('Tovább', _href=URL())}}</div>
+    <div>{{=row.categories.name}}</div>
+    <div>{{=row.posts.title}}</div>
+    <div>{{=pretty_hu_date(row.posts.created_on).encode('utf8')}}</div>
+    <div>{{=row.posts.body}}</div>
+    <div>{{=A('Tovább', _href=URL(c='blog', f='show', args=[row.posts.slug]))}}</div>
   </div>
   {{if i < len(posts) - 1:}}
     <p>---------------</p>
   {{pass}}
 {{pass}}
 
+</div> <!-- <div id="blog-container"> -->

Modified: trunk/web2py/applications/helyesiras_webdev/views/blog/show.html
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/blog/show.html	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/views/blog/show.html	2013-07-30 16:01:08 UTC (rev 877)
@@ -1,5 +1,35 @@
 {{extend 'layout.html'}}
 
-<h1>This is the blog/show.html template</h1>
+{{from util import pretty_hu_date}}
 
-{{=BEAUTIFY(response._vars)}}
+{{block blog_sidebar-first}}
+  <div>Rovatok</div>
+  {{for row in categories:}}
+    <div>{{=A(row.name, _href=URL(c='blog', f='index', vars={'category': row.name}))}}</div>
+  {{pass}}
+  <div>Címkék</div>
+  {{for row in tags:}}
+    <div>{{=A(row.name, _href=URL(c='blog', f='index', vars={'tag': row.name}))}} ({{=len(row.posts)}})</div>
+  {{pass}}
+{{end}}
+
+
+<div id="blog-container">
+
+{{=response.toolbar()}}
+
+<div>{{=post.posts.title}}</div>
+<div>{{=post.categories.name}}</div>
+<div>{{=pretty_hu_date(post.posts.created_on).encode('utf8')}}</div>
+{{ # TODO: image }}
+<div>{{=MARKMIN(post.posts.body)}}</div>
+<div>Címkék:
+  {{for i, tag in enumerate(post.posts.tags):}}
+    <span>{{=A(tag, _href=URL(c='blog', f='index', vars={'tag': tag}))}}</span>{{if i < len(post.posts.tags) - 1:}},{{pass}}
+  {{pass}}
+</div>
+<div>
+<span>Hozzászólások:</span>
+</div>
+
+</div> <!-- <div id="blog-container"> -->

Modified: trunk/web2py/applications/helyesiras_webdev/views/layout.html
===================================================================
--- trunk/web2py/applications/helyesiras_webdev/views/layout.html	2013-07-30 09:33:30 UTC (rev 876)
+++ trunk/web2py/applications/helyesiras_webdev/views/layout.html	2013-07-30 16:01:08 UTC (rev 877)
@@ -136,7 +136,7 @@
       {{end}}               
     </div></div><!-- statusbar -->
     
-    <div id="page"{{if request.function=='index':}} class="front"{{pass}}><div class="wrapper">    <!-- Here my central body -->     
+    <div id="page"{{if request.function=='index' and request.controller=='default':}} class="front"{{pass}}><div class="wrapper">    <!-- Here my central body -->     
 {{if not (request.controller == 'default' and request.function == 'index'):}}
       <div id="sidebar-first">
 {{if request.controller == 'default' and request.function not in ['akh', 'gyik', 'hqa', 'howitworks']:}}




More information about the Hejes-devel mailing list