root/tracslimtimerplugin/0.10/tracslimtimer/users.py

Revision 2203, 4.0 kB (checked in by tst, 2 years ago)

TracSlimTimerPlugin:

Publishing version 0.1.0 minus docs to trac hacks

Line 
1 import os
2 import re
3 import elementtree.ElementTree as ET
4
5 #
6 # This is just a very thin wrapper around a dictionary that stores all the
7 # users. In the future it deserves further encapsulation with classes like
8 # "User" but for now it's just "the simplest thing that could possibly work."
9 #
10
11 class Users:
12     """
13     User management to match trac users with SlimTimer logins
14     """
15
16     def __init__(self, config_file):
17         self.users = {}
18         self._load_config(config_file)
19         self.__config_file = config_file
20
21     def save(self):
22         users = ET.Element("users")
23
24         for username, user in self.users.items():
25
26             xml_user = ET.SubElement(users, "user")
27             if not self._is_generated_username(username):
28                 xml_user.set("tracUser", username)
29
30             if user.has_key('st_user') or user.has_key('st_pass'):
31                 st = ET.SubElement(xml_user, "slimtimer")
32                 st_user = ET.SubElement(st, "username")
33                 st_user.text = user.get('st_user','')
34                 st_pass = ET.SubElement(st, "password")
35                 st_pass.text = user.get('st_pass','')
36
37             xml_user.set("defaultCC",
38                          ('false','true')[bool(user.get('default_cc',False))])
39             xml_user.set("report",
40                          ('false','true')[bool(user.get('report',False))])
41
42         config = open(self.__config_file, 'w')
43         ET.ElementTree(users).write(config)
44         config.close()
45
46     def get_st_user(self, trac_username):
47         return self.users.get(trac_username)
48
49     def get_trac_user(self, st_username):
50         for username, user in self.users.items():
51             if user.get('st_user', '') == st_username:
52                 return username
53
54         return ''
55
56     def get_all_users(self):
57         return self.users
58
59     def get_cc_emails(self):
60         emails = []
61         for user in self.users.values():
62             if user.get('default_cc',False) and user.get('st_user',''):
63                emails.append(user['st_user'])
64         return emails
65
66     def get_reporter_emails(self):
67         emails = []
68         for user in self.users.values():
69             if user.get('report',False) and user.get('st_user',''):
70                emails.append(user['st_user'])
71         return emails
72
73     def add_user(self, trac_username):
74         if self.users.has_key(trac_username):
75             return self.users[trac_username]
76
77         if not trac_username:
78             trac_username = self._generate_username()
79
80         self.users[trac_username] = {}
81         return self.users[trac_username]
82
83     def delete_user(self, trac_username):
84         if not self.users.has_key(trac_username):
85             return
86
87         del self.users[trac_username]
88
89     # Internal methods
90
91     def _load_config(self, config_file):
92         if not os.path.exists(config_file):
93             return
94
95         users = ET.parse(config_file)
96         if not users:
97             return
98
99         for user in users.findall("user"):
100             trac_user = user.get("tracUser", "")
101             if not trac_user:
102                 trac_user = self._generate_username()
103             st_user = user.findtext("slimtimer/username")
104             st_pass = user.findtext("slimtimer/password")
105             default_cc = user.get("defaultCC", "false")
106             report = user.get("report", "false")
107
108             data = {}
109             if (st_user): data['st_user'] = st_user
110             if (st_pass): data['st_pass'] = st_pass
111             data['default_cc'] = bool(default_cc in ('true','yes','1'))
112             data['report'] = bool(report in ('true','yes','1'))
113
114             self.users[trac_user] = data
115
116     def _generate_username(self):
117         for x in range(0,9999):
118             name = "__user%s__" % x
119             if not self.users.has_key(name):
120                 return name
121         else:
122             raise Exception("Ran out of auto-generated usernames")
123
124     def _is_generated_username(self, username):
125         return re.match("__user\d+__", username)
Note: See TracBrowser for help on using the browser.