start refactoring
[meabook] / controller.py
1 """
2 Meabook controller class
3 """
4
5 from meabook.constants import *
6 from gettext import gettext as _
7
8
9 class MeabookController:
10     def __init__(self, model, view_class, renderer_class, config):
11         self.config = config
12         self.model = model
13         self.view = view_class(self, renderer_class(), self.config)
14         self.view.start()
15
16     def stop(self):
17         """Exit the program."""
18
19         self.config.save()
20         self.model.close()
21
22     def get_items(self, parent=0):
23         """Gets from model items with selected level."""
24
25         folders_list = list(self.get_all_folders(parent))
26         files_list = [(fields['cn'], internal_name, 'f') for internal_name, \
27             fields in self.model.get_files(['cn'], parent).items()]
28         return folders_list + files_list
29
30     def get_item(self, _id):
31         """Gets person info."""
32
33         info = []
34         entry = self.model.get_entry(_id)
35         entry_fields = entry.keys()
36         fields_to_show = self.config.get_fields()
37         ordered_fields = []
38         for field in self.config.get_order():
39             if field not in ordered_fields:
40                 ordered_fields.append(field)
41         for field in ordered_fields:
42             if (field in fields_to_show) and (field in entry_fields):
43                 info.append((field, entry[field]))
44         if not 'image' in fields_to_show and 'image' in entry.keys():
45             info.append(('image', entry['image']))
46         return info
47
48     def get_all_folders(self, parent=0):
49         """Gets all filials."""
50
51         return [(name, internal_name, 'd') for name, internal_name in \
52             self.model.get_folders(parent)]
53
54     def get_all_subfolders(self):
55         """Gets all departments."""
56
57         return [(name, internal_name, 'd') for name, internal_name in \
58             self.model.get_folders()]
59
60     def get_all_files(self):
61         """Gets all peoples."""
62
63         # FIXME: read field names from Config
64         files_dict = self.model.get_files(['cn'])
65         return [(files_dict[internal_name]['cn'], internal_name, TYPE_FILE) \
66             for internal_name in files_dict]
67
68     def get_files_by_pattern(self, pattern, separated=False):
69         """Gets all peoples matched pattern."""
70
71         if not separated:
72             return [(name, internal_name, TYPE_FILE) for internal_name, name \
73                 in self.model.get_files_by_pattern(pattern)]
74         else:
75             files_dict = self.model.get_files(['cn', 'o', 'ou'], parent=0, \
76                 pattern=pattern)
77             return [("%s" % files_dict[iname]['cn'], "%s / %s" % \
78                 (files_dict[iname]['o'], files_dict[iname]['ou']), \
79                 iname, TYPE_FILE) for iname in files_dict]
80
81     def get_fields(self):
82         """Returns all exists fields from model."""
83
84         return self.model.get_fields()
85
86     def get_localized_fields(self):
87         """Returns dict with original and localized filed names."""
88
89         return dict([(_(field).decode('utf-8'), field) for field in \
90             self.model.get_fields()])
91
92     def show_about_dialog(self):
93         """Shows view About Dialog."""
94
95         self.view.create_about_dialog()
96
97     def show_configuration_dialog(self):
98         """Shows view Configuration Dialog."""
99
100         self.view.create_configuration_dialog(self, self.config)
101
102     def show_search_dialog(self):
103         """Shows view Search Dialog."""
104
105         self.view.create_search_dialog(self)
106
107     def show_import_dialog(self):
108         """Shows view IMport Dialog."""
109
110         path = self.view.create_import_dialog()
111         if not path:
112             return False
113
114         from meabook.parsers.ldif_parser import MeabookLDIFParser
115         parser = MeabookLDIFParser(open(path), self.model)
116         try:
117             self.view.create_progress_dialog(_('Importing'))
118             #FIXME: implement update_fraction
119             parser.parse()
120             self.config.set_fields(self.model.get_fields())
121             self.config.set_order(self.model.get_fields())
122         except:
123             self.view.create_information_dialog(_('Import error'), \
124                 _('Unsupported file format!'))
125         else:
126             return True