Do things in a more python way
This commit is contained in:
parent
5e1007e7da
commit
7aa99e0cbe
|
@ -2,3 +2,5 @@
|
||||||
*.pyc
|
*.pyc
|
||||||
*_*
|
*_*
|
||||||
*.bdd
|
*.bdd
|
||||||
|
*.gz
|
||||||
|
*.bak
|
|
@ -17,17 +17,11 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
from xml.dom.minidom import parse, parseString
|
|
||||||
from dynastie.generators.generator import DynastieGenerator
|
|
||||||
from dynastie.generators.index import Index
|
from dynastie.generators.index import Index
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
class AllPosts(Index):
|
class AllPosts(Index):
|
||||||
|
|
||||||
filename = 'all_posts'
|
|
||||||
cur_post = 0
|
|
||||||
|
|
||||||
def createPosts(self, posts, dom, root, node):
|
def createPosts(self, posts, dom, root, node):
|
||||||
posts_elem = self.createElement(dom, 'posts')
|
posts_elem = self.createElement(dom, 'posts')
|
||||||
|
|
||||||
|
@ -46,7 +40,7 @@ class AllPosts(Index):
|
||||||
|
|
||||||
def createMonth(self, posts, dom, root, node):
|
def createMonth(self, posts, dom, root, node):
|
||||||
date_format = node.getAttribute('format')
|
date_format = node.getAttribute('format')
|
||||||
if date_format == '':
|
if not date_format:
|
||||||
date_format = '%B'
|
date_format = '%B'
|
||||||
|
|
||||||
self.cur_month = posts[0].creation_date.month
|
self.cur_month = posts[0].creation_date.month
|
||||||
|
@ -57,11 +51,9 @@ class AllPosts(Index):
|
||||||
prev_month = None
|
prev_month = None
|
||||||
for p in posts:
|
for p in posts:
|
||||||
if p.creation_date.month == self.cur_month:
|
if p.creation_date.month == self.cur_month:
|
||||||
cur_posts.append(p)
|
cur_posts.insert(0, p)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
cur_posts.reverse()
|
|
||||||
|
|
||||||
month_elem = self.createElement(dom, 'month')
|
month_elem = self.createElement(dom, 'month')
|
||||||
month_def = dom.createElement('month')
|
month_def = dom.createElement('month')
|
||||||
month_def.appendChild(dom.createTextNode(cur_posts[0].creation_date.strftime(date_format)))
|
month_def.appendChild(dom.createTextNode(cur_posts[0].creation_date.strftime(date_format)))
|
||||||
|
@ -81,7 +73,7 @@ class AllPosts(Index):
|
||||||
cur_posts.append(p)
|
cur_posts.append(p)
|
||||||
|
|
||||||
# Last month
|
# Last month
|
||||||
if len(cur_posts) != 0:
|
if cur_posts:
|
||||||
cur_posts.reverse()
|
cur_posts.reverse()
|
||||||
month_elem = self.createElement(dom, 'month')
|
month_elem = self.createElement(dom, 'month')
|
||||||
month_def = dom.createElement('month')
|
month_def = dom.createElement('month')
|
||||||
|
@ -161,6 +153,8 @@ class AllPosts(Index):
|
||||||
def generate(self, blog, src, output):
|
def generate(self, blog, src, output):
|
||||||
from dynastie.models import Post, Blog, Category
|
from dynastie.models import Post, Blog, Category
|
||||||
|
|
||||||
|
self.filename = 'all_posts'
|
||||||
|
|
||||||
self.hooks['year'] = self.createYear
|
self.hooks['year'] = self.createYear
|
||||||
self.hooks['month'] = self.createMonth
|
self.hooks['month'] = self.createMonth
|
||||||
self.hooks['posts'] = self.createPosts
|
self.hooks['posts'] = self.createPosts
|
||||||
|
|
|
@ -17,23 +17,12 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from xml.dom.minidom import parse, parseString
|
|
||||||
from dynastie.generators.generator import DynastieGenerator
|
|
||||||
from dynastie.generators.index import Index
|
from dynastie.generators.index import Index
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
class Archive(Index):
|
class Archive(Index):
|
||||||
|
|
||||||
cur_page = 0
|
|
||||||
nb_pages = 0
|
|
||||||
cur_post = 0
|
|
||||||
posts_per_page = 0
|
|
||||||
filename = 'index'
|
|
||||||
dirname = ''
|
|
||||||
cur_year = 0
|
|
||||||
|
|
||||||
def createArchive(self, posts, dom, root, node):
|
def createArchive(self, posts, dom, root, node):
|
||||||
if node.hasAttribute('year'):
|
if node.hasAttribute('year'):
|
||||||
self.replaceByText(dom, root, node, str(self.cur_year))
|
self.replaceByText(dom, root, node, str(self.cur_year))
|
||||||
|
@ -54,7 +43,7 @@ class Archive(Index):
|
||||||
return self.report
|
return self.report
|
||||||
|
|
||||||
first_post = posts[0]
|
first_post = posts[0]
|
||||||
last_post = Post.objects.filter(published=True, front_page=True).order_by('-creation_date')[0]
|
last_post = posts[len(posts)-1]
|
||||||
|
|
||||||
start_year = first_post.creation_date.year
|
start_year = first_post.creation_date.year
|
||||||
end_year = last_post.creation_date.year
|
end_year = last_post.creation_date.year
|
||||||
|
@ -65,11 +54,9 @@ class Archive(Index):
|
||||||
|
|
||||||
self.cur_year = i
|
self.cur_year = i
|
||||||
|
|
||||||
posts = Post.objects.filter(published=True, front_page=True, creation_date__gt=datetime(i, 1, 1), creation_date__lt=datetime(i+1, 1, 1)).order_by('-creation_date')
|
posts = Post.objects.filter(published=True, creation_date__gt=datetime(i, 1, 1), creation_date__lt=datetime(i+1, 1, 1)).order_by('-creation_date')
|
||||||
|
|
||||||
self.nb_pages = 0
|
self.resetCounters()
|
||||||
self.cur_page = 0
|
|
||||||
self.cur_post = 0
|
|
||||||
|
|
||||||
self.dirname = '/archive/' + str(i)
|
self.dirname = '/archive/' + str(i)
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
import os
|
import os
|
||||||
import datetime
|
import datetime
|
||||||
import xml
|
import xml
|
||||||
from dynastie.generators.generator import DynastieGenerator
|
|
||||||
from dynastie.generators.rss import RSS
|
from dynastie.generators.rss import RSS
|
||||||
from xml.dom.minidom import getDOMImplementation
|
from xml.dom.minidom import getDOMImplementation
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
|
@ -17,22 +17,11 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
from xml.dom.minidom import parse, parseString
|
|
||||||
from dynastie.generators.generator import DynastieGenerator
|
|
||||||
from dynastie.generators.index import Index
|
from dynastie.generators.index import Index
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
class Category(Index):
|
class Category(Index):
|
||||||
|
|
||||||
cur_page = 0
|
|
||||||
nb_pages = 0
|
|
||||||
cur_post = 0
|
|
||||||
posts_per_page = 0
|
|
||||||
filename = 'index'
|
|
||||||
dirname = ''
|
|
||||||
cur_category = None
|
|
||||||
|
|
||||||
def createCategory(self, posts, dom, root, node):
|
def createCategory(self, posts, dom, root, node):
|
||||||
if node.hasAttribute('name'):
|
if node.hasAttribute('name'):
|
||||||
self.replaceByText(dom, root, node, self.cur_category.name)
|
self.replaceByText(dom, root, node, self.cur_category.name)
|
||||||
|
@ -43,6 +32,8 @@ class Category(Index):
|
||||||
def generate(self, blog, src, output):
|
def generate(self, blog, src, output):
|
||||||
from dynastie.models import Post, Blog, Category
|
from dynastie.models import Post, Blog, Category
|
||||||
|
|
||||||
|
self.cur_category = None
|
||||||
|
|
||||||
self.hooks['category'] = self.createCategory
|
self.hooks['category'] = self.createCategory
|
||||||
|
|
||||||
dom = self.parseTemplate(blog, src, output, 'category', 'category')
|
dom = self.parseTemplate(blog, src, output, 'category', 'category')
|
||||||
|
@ -54,9 +45,7 @@ class Category(Index):
|
||||||
self.cur_category = category
|
self.cur_category = category
|
||||||
posts = Post.objects.filter(category__exact=category, published=True).order_by('-creation_date')
|
posts = Post.objects.filter(category__exact=category, published=True).order_by('-creation_date')
|
||||||
|
|
||||||
self.nb_pages = 0
|
self.resetCounters()
|
||||||
self.cur_page = 0
|
|
||||||
self.cur_post = 0
|
|
||||||
|
|
||||||
self.dirname = '/category/' + category.name_slug
|
self.dirname = '/category/' + category.name_slug
|
||||||
|
|
||||||
|
|
|
@ -56,8 +56,6 @@ class StrictUTF8Writer(codecs.StreamWriter):
|
||||||
class DynastieGenerator:
|
class DynastieGenerator:
|
||||||
|
|
||||||
URI = "http://indefero.soutade.fr/p/dynastie"
|
URI = "http://indefero.soutade.fr/p/dynastie"
|
||||||
report = ''
|
|
||||||
somethingWrote = False
|
|
||||||
|
|
||||||
def __init__(self, hash_posts=None, hash_posts_content=None):
|
def __init__(self, hash_posts=None, hash_posts_content=None):
|
||||||
self.report = ''
|
self.report = ''
|
||||||
|
@ -67,11 +65,11 @@ class DynastieGenerator:
|
||||||
|
|
||||||
def addReport(self, string, color=''):
|
def addReport(self, string, color=''):
|
||||||
if string in self.report: return
|
if string in self.report: return
|
||||||
if color != '':
|
if color:
|
||||||
self.report = self.report + '<span style="color:' + color + '">'
|
self.report = self.report + '<span style="color:' + color + '">'
|
||||||
self.report = self.report + '<b>' + self.__class__.__name__ + '</b> : '
|
self.report = self.report + '<b>' + self.__class__.__name__ + '</b> : '
|
||||||
self.report = self.report + string
|
self.report = self.report + string
|
||||||
if color != '':
|
if color:
|
||||||
self.report = self.report + '</span>'
|
self.report = self.report + '</span>'
|
||||||
self.report = self.report + '<br/>\n'
|
self.report = self.report + '<br/>\n'
|
||||||
|
|
||||||
|
@ -105,8 +103,8 @@ class DynastieGenerator:
|
||||||
else:
|
else:
|
||||||
cache_obj = cache_objs[0]
|
cache_obj = cache_objs[0]
|
||||||
|
|
||||||
if not cache_obj is None or os.path.exists(filename):
|
if cache_obj or os.path.exists(filename):
|
||||||
if cache_obj is None:
|
if not cache_obj:
|
||||||
src_md5 = hashlib.md5()
|
src_md5 = hashlib.md5()
|
||||||
f = open(filename,'rb')
|
f = open(filename,'rb')
|
||||||
src_md5.update(f.read())
|
src_md5.update(f.read())
|
||||||
|
@ -125,6 +123,7 @@ class DynastieGenerator:
|
||||||
f.write(content)
|
f.write(content)
|
||||||
f.close()
|
f.close()
|
||||||
return
|
return
|
||||||
|
if os.path.exists(filename):
|
||||||
os.unlink(filename)
|
os.unlink(filename)
|
||||||
|
|
||||||
if cache_obj is None:
|
if cache_obj is None:
|
||||||
|
@ -161,20 +160,20 @@ class DynastieGenerator:
|
||||||
|
|
||||||
def createElement(self, dom, name='', content='', subtree=None):
|
def createElement(self, dom, name='', content='', subtree=None):
|
||||||
div = dom.createElement('div')
|
div = dom.createElement('div')
|
||||||
if name != '':
|
if name:
|
||||||
div.setAttribute('class', name)
|
div.setAttribute('class', name)
|
||||||
if content != '':
|
if content:
|
||||||
div.appendChild(dom.createTextNode(content))
|
div.appendChild(dom.createTextNode(content))
|
||||||
if not subtree is None:
|
if subtree:
|
||||||
self.cloneSubtree(div, subtree)
|
self.cloneSubtree(div, subtree)
|
||||||
|
|
||||||
return div
|
return div
|
||||||
|
|
||||||
def createMeta(self, dom, name='', content=''):
|
def createMeta(self, dom, name='', content=''):
|
||||||
div = dom.createElement('meta')
|
div = dom.createElement('meta')
|
||||||
if name != '':
|
if name:
|
||||||
div.setAttribute('name', name)
|
div.setAttribute('name', name)
|
||||||
if content != '':
|
if content:
|
||||||
div.setAttribute('content', content)
|
div.setAttribute('content', content)
|
||||||
|
|
||||||
return div
|
return div
|
||||||
|
@ -185,7 +184,7 @@ class DynastieGenerator:
|
||||||
if node.prefix == 'dyn':
|
if node.prefix == 'dyn':
|
||||||
if node.localName in values:
|
if node.localName in values:
|
||||||
content = values[node.localName]
|
content = values[node.localName]
|
||||||
if type(content) == unicode or type(content) == str:
|
if isinstance(content, basestring):
|
||||||
new_elem = self.createElement(dom, node.localName, content)
|
new_elem = self.createElement(dom, node.localName, content)
|
||||||
else:
|
else:
|
||||||
new_elem = self.createElement(dom, node.localName)
|
new_elem = self.createElement(dom, node.localName)
|
||||||
|
@ -204,16 +203,15 @@ class DynastieGenerator:
|
||||||
|
|
||||||
def _parse(self, hooks, posts, dom, root):
|
def _parse(self, hooks, posts, dom, root):
|
||||||
for node in root.childNodes:
|
for node in root.childNodes:
|
||||||
if node.prefix == 'dyn':
|
if node.prefix == 'dyn' and node.localName in hooks:
|
||||||
if node.localName in hooks:
|
|
||||||
node = hooks[node.localName](posts, dom, root, node)
|
node = hooks[node.localName](posts, dom, root, node)
|
||||||
if not node is None and node.hasChildNodes():
|
if node and node.hasChildNodes():
|
||||||
self._parse(hooks, posts, dom, node)
|
self._parse(hooks, posts, dom, node)
|
||||||
|
|
||||||
def parse(self, src, hooks, posts, dom, root):
|
def parse(self, src, hooks, posts, dom, root):
|
||||||
bases = dom.getElementsByTagNameNS(self.URI, 'base')
|
bases = dom.getElementsByTagNameNS(self.URI, 'base')
|
||||||
|
|
||||||
if len(bases) == 0:
|
if not bases:
|
||||||
self._parse(hooks, posts, dom, root)
|
self._parse(hooks, posts, dom, root)
|
||||||
return root
|
return root
|
||||||
|
|
||||||
|
@ -233,7 +231,7 @@ class DynastieGenerator:
|
||||||
return root
|
return root
|
||||||
|
|
||||||
target_blocks = base.getElementsByTagNameNS(self.URI, 'block')
|
target_blocks = base.getElementsByTagNameNS(self.URI, 'block')
|
||||||
if len(target_blocks) == 0:
|
if not target_blocks:
|
||||||
self.addError('No \'block\' defined in ' + src + '/' + filename)
|
self.addError('No \'block\' defined in ' + src + '/' + filename)
|
||||||
return root
|
return root
|
||||||
|
|
||||||
|
|
|
@ -19,24 +19,17 @@
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import datetime
|
import datetime
|
||||||
|
import hashlib
|
||||||
import xml
|
import xml
|
||||||
from xml.parsers.expat import *
|
from xml.parsers.expat import *
|
||||||
import xml.parsers.expat
|
import xml.parsers.expat
|
||||||
from xml.dom.minidom import parse, parseString
|
from xml.dom.minidom import parse, parseString
|
||||||
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
|
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from dynastie.generators import markdown2
|
||||||
|
|
||||||
class Index(DynastieGenerator):
|
class Index(DynastieGenerator):
|
||||||
|
|
||||||
cur_page = 0
|
|
||||||
nb_pages = 0
|
|
||||||
cur_post = 0
|
|
||||||
cur_post_obj = None
|
|
||||||
posts_per_page = 0
|
|
||||||
filename = 'index'
|
|
||||||
dirname = ''
|
|
||||||
blog = None
|
|
||||||
|
|
||||||
def __init__(self, hash_posts=None, hash_posts_content=None):
|
def __init__(self, hash_posts=None, hash_posts_content=None):
|
||||||
DynastieGenerator.__init__(self, hash_posts, hash_posts_content)
|
DynastieGenerator.__init__(self, hash_posts, hash_posts_content)
|
||||||
|
|
||||||
|
@ -55,6 +48,19 @@ class Index(DynastieGenerator):
|
||||||
|
|
||||||
self.first_try = True
|
self.first_try = True
|
||||||
|
|
||||||
|
self.posts_per_page = 5
|
||||||
|
self.filename = 'index'
|
||||||
|
self.dirname = ''
|
||||||
|
self.blog = None
|
||||||
|
|
||||||
|
self.resetCounters()
|
||||||
|
|
||||||
|
def resetCounters(self):
|
||||||
|
self.nb_pages = 0
|
||||||
|
self.cur_page = 0
|
||||||
|
self.cur_post = 0
|
||||||
|
self.cur_post_obj = None
|
||||||
|
|
||||||
def createReplace(self, posts, dom, root, replace_elem):
|
def createReplace(self, posts, dom, root, replace_elem):
|
||||||
if not replace_elem.hasAttribute('div_name'):
|
if not replace_elem.hasAttribute('div_name'):
|
||||||
self.addError('No attribute div_name for a replace tag')
|
self.addError('No attribute div_name for a replace tag')
|
||||||
|
@ -68,7 +74,7 @@ class Index(DynastieGenerator):
|
||||||
|
|
||||||
value = value.replace('dyn:blog_id', str(self.blog.id))
|
value = value.replace('dyn:blog_id', str(self.blog.id))
|
||||||
|
|
||||||
if not self.cur_post_obj is None:
|
if self.cur_post_obj:
|
||||||
url = self.cur_post_obj.getPath()
|
url = self.cur_post_obj.getPath()
|
||||||
full_url = self.cur_post_obj.blog.name + url
|
full_url = self.cur_post_obj.blog.name + url
|
||||||
value = value.replace('dyn:post_url', url)
|
value = value.replace('dyn:post_url', url)
|
||||||
|
@ -96,10 +102,10 @@ class Index(DynastieGenerator):
|
||||||
self.replaceByText(dom, root, node, category)
|
self.replaceByText(dom, root, node, category)
|
||||||
|
|
||||||
def createNavigation(self, posts, dom, root, node):
|
def createNavigation(self, posts, dom, root, node):
|
||||||
if self.nb_pages == 0 or self.nb_pages == 1:
|
if 0 <= self.nb_pages <= 1:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if self.dirname != '':
|
if self.dirname:
|
||||||
if self.dirname.startswith('/'):
|
if self.dirname.startswith('/'):
|
||||||
href = '<a href="' + self.dirname + '/' + self.filename
|
href = '<a href="' + self.dirname + '/' + self.filename
|
||||||
else:
|
else:
|
||||||
|
@ -189,13 +195,13 @@ class Index(DynastieGenerator):
|
||||||
end = code.find('</dyn:code>')
|
end = code.find('</dyn:code>')
|
||||||
|
|
||||||
if end < start:
|
if end < start:
|
||||||
self.addError('Invalid <dyn:code> tags in ' + filename)
|
self.addError('Invalid <dyn:code> tags in ' + self.filename)
|
||||||
break
|
break
|
||||||
|
|
||||||
try:
|
try:
|
||||||
dom = parseString(code[start:end+11])
|
dom = parseString(code[start:end+11])
|
||||||
except xml.dom.DOMException as e:
|
except xml.dom.DOMException as e:
|
||||||
self.addError('Error parsing ' + filename)
|
self.addError('Error parsing ' + self.filename)
|
||||||
break
|
break
|
||||||
|
|
||||||
res = self.createCode(dom, dom.firstChild)
|
res = self.createCode(dom, dom.firstChild)
|
||||||
|
@ -211,12 +217,11 @@ class Index(DynastieGenerator):
|
||||||
node = self.hash_posts[post.id]
|
node = self.hash_posts[post.id]
|
||||||
return node.cloneNode(0)
|
return node.cloneNode(0)
|
||||||
|
|
||||||
values = {}
|
values = {'post_content': '', 'author': 'Unknown'}
|
||||||
try:
|
try:
|
||||||
values['author'] = post.author.first_name + ' ' + post.author.last_name
|
values['author'] = post.author.first_name + ' ' + post.author.last_name
|
||||||
except:
|
except:
|
||||||
values['author'] = 'Unknown'
|
pass
|
||||||
values['post_content'] = ''
|
|
||||||
|
|
||||||
blog = post.blog
|
blog = post.blog
|
||||||
blog.create_paths()
|
blog.create_paths()
|
||||||
|
@ -232,7 +237,6 @@ class Index(DynastieGenerator):
|
||||||
post_content = f.read()
|
post_content = f.read()
|
||||||
f.close()
|
f.close()
|
||||||
if post.content_format == Post.CONTENT_TEXT:
|
if post.content_format == Post.CONTENT_TEXT:
|
||||||
from dynastie.generators import markdown2
|
|
||||||
post_content = markdown2.markdown(post_content)
|
post_content = markdown2.markdown(post_content)
|
||||||
self.hash_posts_content[filename] = post_content
|
self.hash_posts_content[filename] = post_content
|
||||||
else:
|
else:
|
||||||
|
@ -252,8 +256,6 @@ class Index(DynastieGenerator):
|
||||||
content_node.appendChild(new_node)
|
content_node.appendChild(new_node)
|
||||||
|
|
||||||
if post.id in self.hash_posts:
|
if post.id in self.hash_posts:
|
||||||
import hashlib
|
|
||||||
|
|
||||||
# Here, we are in first_try, check that computed
|
# Here, we are in first_try, check that computed
|
||||||
# post has the same result than the one in cache
|
# post has the same result than the one in cache
|
||||||
self.first_try = False
|
self.first_try = False
|
||||||
|
@ -276,7 +278,8 @@ class Index(DynastieGenerator):
|
||||||
# If not, clear cache
|
# If not, clear cache
|
||||||
if md5_1.digest() != md5_2.digest():
|
if md5_1.digest() != md5_2.digest():
|
||||||
self.hash_posts = {}
|
self.hash_posts = {}
|
||||||
|
self.hash_posts[post.id] = post_elem.cloneNode(0)
|
||||||
|
else:
|
||||||
self.hash_posts[post.id] = post_elem.cloneNode(0)
|
self.hash_posts[post.id] = post_elem.cloneNode(0)
|
||||||
|
|
||||||
return post_elem
|
return post_elem
|
||||||
|
@ -293,7 +296,7 @@ class Index(DynastieGenerator):
|
||||||
else:
|
else:
|
||||||
post_elem = self.createElement(dom, '', '<b>No posts yet</b>')
|
post_elem = self.createElement(dom, '', '<b>No posts yet</b>')
|
||||||
self.cur_post_obj = None
|
self.cur_post_obj = None
|
||||||
if not post_elem is None:
|
if post_elem:
|
||||||
posts_elem.appendChild(post_elem)
|
posts_elem.appendChild(post_elem)
|
||||||
|
|
||||||
# Parse inner HTML
|
# Parse inner HTML
|
||||||
|
@ -347,7 +350,7 @@ class Index(DynastieGenerator):
|
||||||
else:
|
else:
|
||||||
cur_post = None
|
cur_post = None
|
||||||
|
|
||||||
if not cur_post is None:
|
if cur_post:
|
||||||
for tag in cur_post.tags.all():
|
for tag in cur_post.tags.all():
|
||||||
if create_link:
|
if create_link:
|
||||||
tag_elem = self.createElement(dom, 'tag')
|
tag_elem = self.createElement(dom, 'tag')
|
||||||
|
@ -442,18 +445,16 @@ class Index(DynastieGenerator):
|
||||||
self.addError('Error parsing _%s.html : ' + e)
|
self.addError('Error parsing _%s.html : ' + e)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if not directory is None and not os.path.exists(output + '/' + directory):
|
if directory and not os.path.exists(output + '/' + directory):
|
||||||
os.mkdir(output + '/' + directory)
|
os.mkdir(output + '/' + directory)
|
||||||
|
|
||||||
if not parsePostsTag: return dom
|
if not parsePostsTag: return dom
|
||||||
|
|
||||||
post_nodes = dom.getElementsByTagNameNS(self.URI, "posts")
|
post_nodes = dom.getElementsByTagNameNS(self.URI, "posts")
|
||||||
|
|
||||||
if not post_nodes is None and len(post_nodes) > 0:
|
if post_nodes:
|
||||||
if post_nodes[0].hasAttribute("limit"):
|
if post_nodes[0].hasAttribute("limit"):
|
||||||
self.posts_per_page = int(post_nodes[0].getAttribute("limit"))
|
self.posts_per_page = int(post_nodes[0].getAttribute("limit"))
|
||||||
else:
|
|
||||||
self.posts_per_page = 5
|
|
||||||
else:
|
else:
|
||||||
self.addWarning('No tag dyn:posts found')
|
self.addWarning('No tag dyn:posts found')
|
||||||
|
|
||||||
|
|
|
@ -18,22 +18,13 @@
|
||||||
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
from xml.dom.minidom import parse, parseString
|
from xml.dom.minidom import parse
|
||||||
import xml.parsers.expat
|
import xml.parsers.expat
|
||||||
from dynastie.generators.generator import DynastieGenerator
|
|
||||||
from dynastie.generators.index import Index
|
from dynastie.generators.index import Index
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
class LJDC(Index):
|
class LJDC(Index):
|
||||||
|
|
||||||
cur_page = 0
|
|
||||||
nb_pages = 0
|
|
||||||
cur_post = 0
|
|
||||||
posts_per_page = 20
|
|
||||||
filename = 'index'
|
|
||||||
dirname = '/ljdc'
|
|
||||||
cur_category = None
|
|
||||||
|
|
||||||
def createPost(self, posts, dom, post_elem, root):
|
def createPost(self, posts, dom, post_elem, root):
|
||||||
new_elem = self.createElement(dom, 'ljdc')
|
new_elem = self.createElement(dom, 'ljdc')
|
||||||
|
|
||||||
|
@ -73,6 +64,9 @@ class LJDC(Index):
|
||||||
return srcdom
|
return srcdom
|
||||||
|
|
||||||
def generate(self, blog, src, output):
|
def generate(self, blog, src, output):
|
||||||
|
self.posts_per_page = 20
|
||||||
|
self.dirname = '/ljdc'
|
||||||
|
|
||||||
srcdom = self._load_references(src)
|
srcdom = self._load_references(src)
|
||||||
|
|
||||||
if srcdom is None: return None
|
if srcdom is None: return None
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
"""
|
"""
|
||||||
import datetime
|
import datetime
|
||||||
import os
|
import os
|
||||||
|
import xml
|
||||||
from xml.dom.minidom import parse, parseString
|
from xml.dom.minidom import parse, parseString
|
||||||
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
|
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
|
||||||
from dynastie.generators.index import Index
|
from dynastie.generators.index import Index
|
||||||
|
@ -27,9 +28,6 @@ from dynastie.tree import TreeNode
|
||||||
|
|
||||||
class Post(Index):
|
class Post(Index):
|
||||||
|
|
||||||
cur_comment = None
|
|
||||||
comment_index = {}
|
|
||||||
|
|
||||||
def createReplace(self, post, dom, root, replace_elem):
|
def createReplace(self, post, dom, root, replace_elem):
|
||||||
if not replace_elem.hasAttribute('div_name'):
|
if not replace_elem.hasAttribute('div_name'):
|
||||||
self.addError('No attribute div_name for a replace tag')
|
self.addError('No attribute div_name for a replace tag')
|
||||||
|
@ -43,13 +41,10 @@ class Post(Index):
|
||||||
value = value.replace('dyn:post_id', str(post.id))
|
value = value.replace('dyn:post_id', str(post.id))
|
||||||
if self.cur_comment is None:
|
if self.cur_comment is None:
|
||||||
value = value.replace('dyn:comment_index', '0')
|
value = value.replace('dyn:comment_index', '0')
|
||||||
else:
|
|
||||||
value = value.replace('dyn:comment_index', str(self.comment_index[self.cur_comment.id]))
|
|
||||||
if self.cur_comment is None:
|
|
||||||
value = value.replace('dyn:comment_id', '0')
|
value = value.replace('dyn:comment_id', '0')
|
||||||
else:
|
else:
|
||||||
|
value = value.replace('dyn:comment_index', str(self.comment_index[self.cur_comment.id]))
|
||||||
value = value.replace('dyn:comment_id', str(self.cur_comment.id))
|
value = value.replace('dyn:comment_id', str(self.cur_comment.id))
|
||||||
|
|
||||||
value = value.replace('dyn:blog_id', str(self.blog.id))
|
value = value.replace('dyn:blog_id', str(self.blog.id))
|
||||||
url = post.getPath()
|
url = post.getPath()
|
||||||
full_url = post.blog.name + url
|
full_url = post.blog.name + url
|
||||||
|
@ -86,8 +81,8 @@ class Post(Index):
|
||||||
|
|
||||||
comments = Comment.objects.filter(post=post).order_by('date')
|
comments = Comment.objects.filter(post=post).order_by('date')
|
||||||
|
|
||||||
cur_comment = None
|
self.cur_comment = None
|
||||||
comment_index = {}
|
self.comment_index = {}
|
||||||
index = 1
|
index = 1
|
||||||
|
|
||||||
rootNode = TreeNode('', '')
|
rootNode = TreeNode('', '')
|
||||||
|
@ -146,9 +141,12 @@ class Post(Index):
|
||||||
self.addError('name attribute \'' + name + '\' unknown for dyn:meta' )
|
self.addError('name attribute \'' + name + '\' unknown for dyn:meta' )
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _createPost(self, post, dom, post_elem, root):
|
def createPostTitle(self, post, dom, root, node):
|
||||||
import sys, traceback
|
value = post.title.replace('"', '“')
|
||||||
|
self.replaceByText(dom, root, node, value)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _createPost(self, post, dom, post_elem, root):
|
||||||
self.cur_post_obj = post
|
self.cur_post_obj = post
|
||||||
posts = [post]
|
posts = [post]
|
||||||
self.createPost(posts, dom, post_elem, root)
|
self.createPost(posts, dom, post_elem, root)
|
||||||
|
@ -169,12 +167,16 @@ class Post(Index):
|
||||||
return node
|
return node
|
||||||
|
|
||||||
def _generate(self, blog, src, output, posts):
|
def _generate(self, blog, src, output, posts):
|
||||||
import xml
|
from dynastie.search import Search
|
||||||
|
|
||||||
|
self.cur_comment = None
|
||||||
|
self.comment_index = {}
|
||||||
|
|
||||||
self.hooks['post'] = self._createPost
|
self.hooks['post'] = self._createPost
|
||||||
self.hooks['meta'] = self.createMetas
|
self.hooks['meta'] = self.createMetas
|
||||||
self.hooks['comments'] = self.createComments
|
self.hooks['comments'] = self.createComments
|
||||||
self.hooks['replace'] = self.createReplace
|
self.hooks['replace'] = self.createReplace
|
||||||
|
self.hooks['post_title'] = self.createPostTitle
|
||||||
del self.hooks['navigation']
|
del self.hooks['navigation']
|
||||||
del self.hooks['recents']
|
del self.hooks['recents']
|
||||||
del self.hooks['posts']
|
del self.hooks['posts']
|
||||||
|
@ -183,6 +185,7 @@ class Post(Index):
|
||||||
if dom is None: return self.report
|
if dom is None: return self.report
|
||||||
|
|
||||||
impl = xml.dom.getDOMImplementation()
|
impl = xml.dom.getDOMImplementation()
|
||||||
|
s = Search()
|
||||||
for post in posts:
|
for post in posts:
|
||||||
filename = output + '/post/'
|
filename = output + '/post/'
|
||||||
filename = filename + post.creation_date.strftime("%Y") + '/' + post.creation_date.strftime("%m") + '/'
|
filename = filename + post.creation_date.strftime("%Y") + '/' + post.creation_date.strftime("%m") + '/'
|
||||||
|
@ -192,11 +195,9 @@ class Post(Index):
|
||||||
|
|
||||||
if not post.published:
|
if not post.published:
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
from dynastie.search import *
|
|
||||||
os.unlink(filename)
|
os.unlink(filename)
|
||||||
os.unlink(filename + '.gz')
|
os.unlink(filename + '.gz')
|
||||||
self.addReport('Remove ' + filename)
|
self.addReport('Remove ' + filename)
|
||||||
s = Search()
|
|
||||||
s.delete_post(blog, post.id)
|
s.delete_post(blog, post.id)
|
||||||
continue
|
continue
|
||||||
#print 'Generate ' + filename
|
#print 'Generate ' + filename
|
||||||
|
|
|
@ -30,7 +30,7 @@ class RSS(DynastieGenerator):
|
||||||
|
|
||||||
def appendElement(self, dom, root, name='', content='', attributes=None):
|
def appendElement(self, dom, root, name='', content='', attributes=None):
|
||||||
elem = dom.createElement(name)
|
elem = dom.createElement(name)
|
||||||
if not attributes is None:
|
if attributes:
|
||||||
for k, v in attributes.iteritems():
|
for k, v in attributes.iteritems():
|
||||||
elem.setAttribute(k, v)
|
elem.setAttribute(k, v)
|
||||||
if content != '':
|
if content != '':
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
from datetime import datetime
|
|
||||||
from xml.dom.minidom import parse, parseString
|
from xml.dom.minidom import parse, parseString
|
||||||
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
|
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
|
||||||
from dynastie.generators.index import Index
|
from dynastie.generators.index import Index
|
||||||
|
@ -47,7 +46,7 @@ class Search(Index):
|
||||||
return self.report
|
return self.report
|
||||||
|
|
||||||
post_nodes = dom.getElementsByTagNameNS(self.URI, "posts")
|
post_nodes = dom.getElementsByTagNameNS(self.URI, "posts")
|
||||||
if not post_nodes is None:
|
if post_nodes:
|
||||||
if post_nodes[0].hasAttribute("limit"):
|
if post_nodes[0].hasAttribute("limit"):
|
||||||
self.posts_per_page = int(post_nodes[0].getAttribute("limit"))
|
self.posts_per_page = int(post_nodes[0].getAttribute("limit"))
|
||||||
else:
|
else:
|
||||||
|
@ -64,7 +63,7 @@ class Search(Index):
|
||||||
post = Post.objects.get(pk=post_id)
|
post = Post.objects.get(pk=post_id)
|
||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
if not post is None:
|
if post:
|
||||||
posts.append(post)
|
posts.append(post)
|
||||||
|
|
||||||
nodes = dom.getElementsByTagName("*")
|
nodes = dom.getElementsByTagName("*")
|
||||||
|
|
|
@ -17,22 +17,11 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
from xml.dom.minidom import parse, parseString
|
|
||||||
from dynastie.generators.generator import DynastieGenerator
|
|
||||||
from dynastie.generators.index import Index
|
from dynastie.generators.index import Index
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
class Tag(Index):
|
class Tag(Index):
|
||||||
|
|
||||||
cur_page = 0
|
|
||||||
nb_pages = 0
|
|
||||||
cur_post = 0
|
|
||||||
posts_per_page = 0
|
|
||||||
filename = 'index'
|
|
||||||
dirname = ''
|
|
||||||
cur_tag = None
|
|
||||||
|
|
||||||
def createTag(self, posts, dom, root, node):
|
def createTag(self, posts, dom, root, node):
|
||||||
if node.hasAttribute('name'):
|
if node.hasAttribute('name'):
|
||||||
self.replaceByText(dom, root, node, self.cur_tag.name)
|
self.replaceByText(dom, root, node, self.cur_tag.name)
|
||||||
|
@ -43,6 +32,7 @@ class Tag(Index):
|
||||||
def generate(self, blog, src, output):
|
def generate(self, blog, src, output):
|
||||||
from dynastie.models import Post, Blog, Tag
|
from dynastie.models import Post, Blog, Tag
|
||||||
|
|
||||||
|
self.cur_tag = None
|
||||||
self.hooks['tag'] = self.createTag
|
self.hooks['tag'] = self.createTag
|
||||||
|
|
||||||
dom = self.parseTemplate(blog, src, output, 'tag', 'tag')
|
dom = self.parseTemplate(blog, src, output, 'tag', 'tag')
|
||||||
|
@ -54,9 +44,7 @@ class Tag(Index):
|
||||||
self.cur_tag = tag
|
self.cur_tag = tag
|
||||||
posts = Post.objects.filter(tags__in=[tag.id], published=True).order_by('-creation_date')
|
posts = Post.objects.filter(tags__in=[tag.id], published=True).order_by('-creation_date')
|
||||||
|
|
||||||
self.nb_pages = 0
|
self.resetCounters()
|
||||||
self.cur_page = 0
|
|
||||||
self.cur_post = 0
|
|
||||||
|
|
||||||
self.dirname = '/tag/' + tag.name_slug
|
self.dirname = '/tag/' + tag.name_slug
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@ class Blog(models.Model):
|
||||||
engine = line.strip()
|
engine = line.strip()
|
||||||
if not engine in globals():
|
if not engine in globals():
|
||||||
print 'Engine ' + engine + ' doesn\'t exists'
|
print 'Engine ' + engine + ' doesn\'t exists'
|
||||||
|
else:
|
||||||
self.engines.append(globals()[engine])
|
self.engines.append(globals()[engine])
|
||||||
f.close()
|
f.close()
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -205,15 +205,11 @@ class Search:
|
||||||
for key in hashtable.keys():
|
for key in hashtable.keys():
|
||||||
if reg.match(key):
|
if reg.match(key):
|
||||||
for post in hashtable[key]:
|
for post in hashtable[key]:
|
||||||
if not post[0] in res:
|
res[post[0]] = res.get(post[0],0) + post[1]
|
||||||
res[post[0]] = post[1]
|
|
||||||
else:
|
|
||||||
res[post[0]] += post[1]
|
|
||||||
|
|
||||||
sorted_res = sorted(res.iteritems(), key=operator.itemgetter(1))
|
sorted_res = sorted(res.iteritems(), key=operator.itemgetter(1))
|
||||||
sorted_res.reverse()
|
sorted_res.reverse()
|
||||||
|
|
||||||
res = []
|
res = [sorted_res[i][0] for i in range(len(sorted_res))]
|
||||||
for i in range(len(sorted_res)):
|
|
||||||
res .append(sorted_res[i][0])
|
|
||||||
return res
|
return res
|
||||||
|
|
|
@ -53,7 +53,7 @@ def have_I_right(request, blog_id=None, post_id=None, must_be_superuser=False, c
|
||||||
if must_be_superuser and not request.user.is_superuser:
|
if must_be_superuser and not request.user.is_superuser:
|
||||||
raise Http404
|
raise Http404
|
||||||
|
|
||||||
if not post_id is None:
|
if post_id:
|
||||||
p = cls.objects.get(pk=post_id)
|
p = cls.objects.get(pk=post_id)
|
||||||
|
|
||||||
if p is None:
|
if p is None:
|
||||||
|
@ -61,10 +61,10 @@ def have_I_right(request, blog_id=None, post_id=None, must_be_superuser=False, c
|
||||||
|
|
||||||
blog_id = p.blog.id
|
blog_id = p.blog.id
|
||||||
|
|
||||||
if not blog_id is None:
|
if blog_id:
|
||||||
if not request.user.is_superuser:
|
if not request.user.is_superuser:
|
||||||
b = Blog.objects.filter(pk=blog_id, writers=request.user.id)
|
b = Blog.objects.filter(pk=blog_id, writers=request.user.id)
|
||||||
if len(b) == 0:
|
if not b:
|
||||||
raise Http404
|
raise Http404
|
||||||
b = b[0]
|
b = b[0]
|
||||||
else:
|
else:
|
||||||
|
@ -128,14 +128,11 @@ def index(request):
|
||||||
|
|
||||||
def disconnect(request):
|
def disconnect(request):
|
||||||
logout(request)
|
logout(request)
|
||||||
c = {'login_failed' : False}
|
|
||||||
return HttpResponseRedirect('/')
|
return HttpResponseRedirect('/')
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def user(request):
|
def user(request):
|
||||||
users = User.objects.all()
|
c = {'users' : User.objects.all()}
|
||||||
|
|
||||||
c = {'users' : users}
|
|
||||||
|
|
||||||
return render(request, 'user.html', c)
|
return render(request, 'user.html', c)
|
||||||
|
|
||||||
|
@ -286,6 +283,7 @@ def edit_tag(request, tag_id):
|
||||||
return HttpResponseRedirect('/tag/' + str(b.id))
|
return HttpResponseRedirect('/tag/' + str(b.id))
|
||||||
if 'edit' in request.POST:
|
if 'edit' in request.POST:
|
||||||
name = tag.name
|
name = tag.name
|
||||||
|
name = name.strip()
|
||||||
form = TagForm(request.POST, instance=tag)
|
form = TagForm(request.POST, instance=tag)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
if request.POST['name'] != name:
|
if request.POST['name'] != name:
|
||||||
|
@ -351,10 +349,7 @@ def view_blog(request, blog_id):
|
||||||
if 'page' in request.GET:
|
if 'page' in request.GET:
|
||||||
cur_page = int(request.GET['page'])
|
cur_page = int(request.GET['page'])
|
||||||
else:
|
else:
|
||||||
if 'cur_page' in request.session:
|
cur_page = request.session.get('cur_page',0)
|
||||||
cur_page = request.session['cur_page']
|
|
||||||
else:
|
|
||||||
cur_page = 0
|
|
||||||
|
|
||||||
if cur_page <= 0:
|
if cur_page <= 0:
|
||||||
drafts = Draft.objects.filter(blog=b).order_by('-creation_date')
|
drafts = Draft.objects.filter(blog=b).order_by('-creation_date')
|
||||||
|
@ -374,15 +369,13 @@ def view_blog(request, blog_id):
|
||||||
end = start + 50 + drafts.count()
|
end = start + 50 + drafts.count()
|
||||||
|
|
||||||
orig_posts = orig_posts.order_by('-creation_date')[start:end]
|
orig_posts = orig_posts.order_by('-creation_date')[start:end]
|
||||||
posts = []
|
|
||||||
for p in orig_posts:
|
# Select post without drafts
|
||||||
found = False
|
if drafts:
|
||||||
for d in drafts:
|
drafts_id = [draft.id for draft in drafts]
|
||||||
if d.id == p.id:
|
posts = [p for p in orig_posts if not p.id in drafts_id]
|
||||||
found = True
|
else:
|
||||||
break
|
posts = orig_posts
|
||||||
if not found:
|
|
||||||
posts.append(p)
|
|
||||||
|
|
||||||
form = BlogForm(instance=b)
|
form = BlogForm(instance=b)
|
||||||
|
|
||||||
|
@ -390,10 +383,7 @@ def view_blog(request, blog_id):
|
||||||
dict_comments = {}
|
dict_comments = {}
|
||||||
for comment in comments:
|
for comment in comments:
|
||||||
key = comment.post.id
|
key = comment.post.id
|
||||||
if not key in dict_comments:
|
dict_comments[key] = dict_comments.get(key, 0) + 1
|
||||||
dict_comments[key] = 1
|
|
||||||
else:
|
|
||||||
dict_comments[key] = dict_comments[key] + 1
|
|
||||||
|
|
||||||
navigation_bar = createNavigationBar(b.id, cur_page, nb_pages)
|
navigation_bar = createNavigationBar(b.id, cur_page, nb_pages)
|
||||||
|
|
||||||
|
@ -461,10 +451,7 @@ def search_blog(request, blog_id):
|
||||||
dict_comments = {}
|
dict_comments = {}
|
||||||
for comment in comments:
|
for comment in comments:
|
||||||
key = comment.post.id
|
key = comment.post.id
|
||||||
if not key in dict_comments:
|
dict_comments[key] = dict_comments.get(key, 0) + 1
|
||||||
dict_comments[key] = 1
|
|
||||||
else:
|
|
||||||
dict_comments[key] = dict_comments[key] + 1
|
|
||||||
|
|
||||||
c = {'blog' : b, 'posts' : posts, 'comments' : dict_comments}
|
c = {'blog' : b, 'posts' : posts, 'comments' : dict_comments}
|
||||||
|
|
||||||
|
@ -552,9 +539,7 @@ def edit_post(request, post_id):
|
||||||
content = 'Empty post'
|
content = 'Empty post'
|
||||||
|
|
||||||
comments = Comment.objects.filter(post=post).order_by('date')
|
comments = Comment.objects.filter(post=post).order_by('date')
|
||||||
comment_list = []
|
comment_list = [comment for comment in comments]
|
||||||
for comment in comments:
|
|
||||||
comment_list.append(comment)
|
|
||||||
|
|
||||||
return render(request, 'edit_post.html', {
|
return render(request, 'edit_post.html', {
|
||||||
'form': form, 'post_id' : post_id, 'content' : content,
|
'form': form, 'post_id' : post_id, 'content' : content,
|
||||||
|
@ -652,10 +637,7 @@ def _generate(request, blog_id, report):
|
||||||
dict_comments = {}
|
dict_comments = {}
|
||||||
for comment in comments:
|
for comment in comments:
|
||||||
key = comment.post.id
|
key = comment.post.id
|
||||||
if not key in dict_comments:
|
dict_comments[key] = dict_comments.get(key, 0) + 1
|
||||||
dict_comments[key] = 1
|
|
||||||
else:
|
|
||||||
dict_comments[key] = dict_comments[key] + 1
|
|
||||||
|
|
||||||
navigation_bar = createNavigationBar(b.id, 0, nb_pages)
|
navigation_bar = createNavigationBar(b.id, 0, nb_pages)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue