summaryrefslogtreecommitdiffstats
path: root/nlwikinfo.py
blob: 167f24cf0dec1bfeef7a473981588b5adf42d2da (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# -*- coding: iso8859-1 -*-
#
# Copyright (C) 2005 Jani Tiainen
#
# Trac is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# NlWikinfo is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# Author: Jani Tiainen <redetin@luukku.com>

from __future__ import generators
import imp
import inspect
import os.path
import time
import shutil
import re

try:
	from cStringIO import StringIO
except ImportError:
	from StringIO import StringIO

from trac.core import *
from trac.wiki.api import IWikiMacroProvider, WikiSystem

class NLWikinfoMacro(Component):
	"""
	Output different information by keyword.
	
	Currently supported infos:
	
	author	      - Author of first version
	version       - Latest version of page
	changed_by    - Page last changed by
	comment       - Latest comment of changed by
	changed_ts    - Page last changed timestamp
	"""
	implements(IWikiMacroProvider)
	
	# IWikiMacroProvider methods
	def get_macros(self):
		yield 'NlWikinfo'
	
	def get_macro_description(self, name):
		return inspect.getdoc(NLWikinfoMacro)
	
	def render_macro(self, req, name, content):
		if content:
			keywords = [arg.strip() for arg in content.split(',')]
		
		buf = StringIO()
		
		for nfo in keywords:
			try:
				getattr(self, '_do_%s' % nfo)(req, name, content, buf)
			except AttributeError:
				buf.write('INVALID: %s' % nfo)
			
		return buf.getvalue()

	# Private methods
	def _do_author(self, req, name, content, buf):
		db = self.env.get_db_cnx()
		cursor = db.cursor()

		sql = "SELECT author, version FROM wiki where name = '%s' order by version limit 1" % req.hdf['wiki.page_name']
		cursor.execute(sql)
		
		row = cursor.fetchone()
		
		buf.write(row[0])
		
	def _do_version(self, req, name, content, buf):
		db = self.env.get_db_cnx()
		cursor = db.cursor()

		sql = "SELECT max(version) FROM wiki where name = '%s'" % req.hdf['wiki.page_name']
		cursor.execute(sql)
		
		row = cursor.fetchone()
		
		buf.write(str(row[0]))

	def _do_changed_by(self, req, name, content, buf):
		db = self.env.get_db_cnx()
		cursor = db.cursor()

		sql = "SELECT author, version FROM wiki where name = '%s' order by version desc limit 1" % req.hdf['wiki.page_name']
		cursor.execute(sql)
		
		row = cursor.fetchone()
		
		buf.write(row[0])

	def _do_changed_ts(self, req, name, content, buf):
		db = self.env.get_db_cnx()
		cursor = db.cursor()

		sql = "SELECT time, version FROM wiki where name = '%s' order by version desc limit 1" % req.hdf['wiki.page_name']
		cursor.execute(sql)
		
		row = cursor.fetchone()
		
		buf.write(time.strftime('%x', time.localtime(row[0])))

	def _do_comment(self, req, name, content, buf):
		db = self.env.get_db_cnx()
		cursor = db.cursor()

		sql = "SELECT comment, version FROM wiki where name = '%s' order by version desc limit 1" % req.hdf['wiki.page_name']
		cursor.execute(sql)
		
		row = cursor.fetchone()
		
		buf.write(row[0])