added files
[meabook] / controller.py
1 """
2 Meabook controller class
3 """
4
5 import shutil
6 from meabook.constants import *
7 from meabook.caller import PhoneCaller
8 from gettext import gettext as _
9
10
11 class MeabookController:
12     def __init__(self, model, view_class, renderer_class, config):
13         self.config = config
14         self.caller = PhoneCaller()
15         self.model = model
16         self.view = view_class(self, renderer_class(), self.config)
17         self.view.start()
18
19     def stop(self):
20         """Exit the program."""
21
22         self.config.save()
23         self.model.close()
24
25     def call(self, number):
26         """Make a phone call."""
27
28         self.caller.call(number)
29
30     def get_items(self, parent=0):
31         """Gets from model items with selected level."""
32
33         folders_list = list(self.get_all_folders(parent))
34         files_list = [(fields['cn'], internal_name, 'f') for internal_name, \
35             fields in self.model.get_files(['cn'], parent).items()]
36         return folders_list + files_list
37
38     def get_item(self, _id):
39         """Gets person info."""
40
41         info = []
42         entry = self.model.get_entry(_id)
43         entry_fields = entry.keys()
44         fields_to_show = self.config.get_fields()
45         ordered_fields = []
46         for field in self.config.get_order():
47             if field not in ordered_fields:
48                 ordered_fields.append(field)
49         for field in ordered_fields:
50             if (field in fields_to_show) and (field in entry_fields):
51                 info.append((field, entry[field]))
52         if not 'image' in fields_to_show and 'image' in entry.keys():
53             info.append(('image', entry['image']))
54         return info
55
56     def get_all_folders(self, parent=0):
57         """Gets all filials."""
58
59         return [(name, internal_name, 'd') for name, internal_name in \
60             self.model.get_folders(parent)]
61
62     def get_all_subfolders(self):
63         """Gets all departments."""
64
65         return [(name, internal_name, 'd') for name, internal_name in \
66             self.model.get_folders()]
67
68     def get_files_by_pattern_ex(self, key, pattern=''):
69         """Gets all peoples matched pattern."""
70
71         files_dict = self.model.get_files_by_pattern(['cn', 'o', 'ou'], \
72             key, pattern, False)
73         return [("%s" % files_dict[internal_name]['cn'], "%s / %s" % (
74             files_dict[internal_name]['o'], files_dict[internal_name]['ou']), \
75             internal_name, TYPE_FILE) for internal_name in files_dict]
76
77     def get_files_by_pattern(self, pattern=''):
78         """Gets all peoples matched pattern."""
79
80         files_dict = self.model.get_files_by_pattern(['cn', 'o', 'ou'], \
81             'cn', pattern, True)
82         return [("%s" % files_dict[internal_name]['cn'], "%s / %s" % (
83             files_dict[internal_name]['o'], files_dict[internal_name]['ou']), \
84             internal_name, TYPE_FILE) for internal_name in files_dict]
85
86     def get_fields(self):
87         """Returns all exists fields from model."""
88
89         return self.model.get_fields()
90
91     def get_localized_fields(self):
92         """Returns dict with original and localized filed names."""
93
94         return dict([(_(field).decode('utf-8'), field) for field in \
95             self.model.get_fields()])
96
97     def show_about_dialog(self):
98         """Shows view About Dialog."""
99
100         self.view.create_about_dialog()
101
102     def show_configuration_dialog(self):
103         """Shows view Configuration Dialog."""
104
105         self.view.create_configuration_dialog(self, self.config.get_fields(), \
106             self.config.get_order())
107
108     def show_fields_configuration_dialog(self, parent):
109         """Shows FieldsConfigurationDialog."""
110
111         selected_fields = self.view.create_fields_configuration_dialog( \
112             self.get_localized_fields(), self.config.get_fields(), parent)
113         if selected_fields is not None:
114             self.config.set_fields(selected_fields)
115         return selected_fields
116
117     def show_fields_order_configuration_dialog(self):
118         """Shows FieldsOrderConfigurationDialog."""
119
120         selected_fields = self.view.create_fields_order_configuration_dialog( \
121             self.get_localized_fields(), self.config.get_order())
122         if selected_fields is not None:
123             self.config.set_order(selected_fields)
124         return selected_fields
125
126     def show_search_dialog(self):
127         """Shows view Search Dialog."""
128
129         self.view.create_search_dialog(self)
130
131     def show_import_dialog(self):
132         """Shows view IMport Dialog."""
133
134         result = self.view.create_import_dialog()
135         if not result:
136             return False
137
138         import_type, path = result
139         if import_type == 'ldif':
140             from meabook.parsers.ldif_parser import MeabookLDIFParser
141             parser = MeabookLDIFParser(open(path), self.model)
142             try:
143                 self.view.create_progress_dialog(_('Importing'))
144                 #FIXME: implement update_fraction
145                 parser.parse()
146             except:
147                 self.view.create_information_dialog(_('Import error'), \
148                     _('Unsupported file format!'))
149                 return False
150         elif import_type == 'db':
151             self.model.close()
152             try:
153                 shutil.copy(path, self.model._path)
154             except:
155                 self.model.connect()                
156                 self.view.create_information_dialog(_('Import error'), \
157                     _('Unable to copy database file!'))
158                 return False
159             else:
160                 self.model.connect()                
161         
162         self.config.set_fields(self.model.get_fields())
163         self.config.set_order(self.model.get_fields())
164         return True