summaryrefslogtreecommitdiffstats
path: root/wikinfo/wikinfo.py
blob: 21314b02562624801b3330ae9f3225207f4eac03 (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
128
129
130
# -*- coding: iso-8859-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>
#
# Updated for Trac 0.11 by Johan Risberg <gannis@users.sourceforge.net>

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 WikinfoMacro(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 'Wikinfo'

	def get_macro_description(self, name):
		return inspect.getdoc(WikinfoMacro)

	def expand_macro(self, formatter, name, content):
		if content:
			keywords = [arg.strip() for arg in content.split(',')]

		buf = StringIO()

		for nfo in keywords:
                        try:
				getattr(self, '_do_%s' % nfo)(formatter.resource.id, name, content, buf)
			except AttributeError:
				buf.write('INVALID: %s' % nfo)

		return buf.getvalue()

	# Private methods
	def _do_author(self, page, 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" % page
		cursor.execute(sql)

		row = cursor.fetchone()

		buf.write(row[0])


	def _do_version(self, page, name, content, buf):
		db = self.env.get_db_cnx()
		cursor = db.cursor()

		sql = "SELECT max(version) FROM wiki where name = '%s'" % page
		cursor.execute(sql)

		row = cursor.fetchone()

		buf.write(str(row[0]))

	def _do_changed_by(self, page, 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" % page
		cursor.execute(sql)

		row = cursor.fetchone()

		buf.write(row[0])

	def _do_changed_ts(self, page, 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" % page
		cursor.execute(sql)

		row = cursor.fetchone()

		buf.write(time.strftime('%x', time.localtime(row[0]/1000000)))

	def _do_comment(self, page, 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" % page
		cursor.execute(sql)

		row = cursor.fetchone()

		buf.write(row[0])