1+ from time_tracker_api .errors \
2+ import MissingResource , InvalidInput , InvalidMatch
3+
4+
5+ class InMemoryProjectDAO (object ):
6+ def __init__ (self ):
7+ self .counter = 0
8+ self .projects = []
9+
10+ def get_all (self ):
11+ return self .projects
12+
13+ def get (self , uid ):
14+ for project in self .projects :
15+ if project .get ('uid' ) == uid :
16+ return project
17+ raise MissingResource ("Project '%s' not found" % uid )
18+
19+ def create (self , project ):
20+ self .counter += 1
21+ project ['uid' ] = str (self .counter )
22+ self .projects .append (project )
23+ return project
24+
25+ def update (self , uid , data ):
26+ project = self .get (uid )
27+ if project :
28+ project .update (data )
29+ return project
30+ else :
31+ raise MissingResource ("Project '%s' not found" % uid )
32+
33+ def delete (self , uid ):
34+ if uid :
35+ project = self .get (uid )
36+ self .projects .remove (project )
37+
38+ def flush (self ):
39+ self .projects .clear ()
40+
41+ def search (self , search_criteria ):
42+ matching_projects = self .select_matching_projects (search_criteria )
43+
44+ if len (matching_projects ) > 0 :
45+ return matching_projects
46+ else :
47+ raise InvalidMatch ("No project matched the specified criteria" )
48+
49+ def select_matching_projects (self , user_search_criteria ):
50+ search_criteria = {k : v for k , v
51+ in user_search_criteria .items ()
52+ if v is not None }
53+
54+ def matches_search_string (search_str , project ):
55+ return search_str in project ['comments' ] or \
56+ search_str in project ['short_name' ]
57+
58+ if not search_criteria :
59+ raise InvalidInput ("No search criteria specified" )
60+
61+ search_str = search_criteria .get ('search_string' )
62+ if search_str :
63+ matching_projects = [p for p
64+ in self .projects
65+ if matches_search_string (search_str , p )]
66+ else :
67+ matching_projects = self .projects
68+
69+ is_active = search_criteria .get ('active' )
70+ if is_active is not None :
71+ matching_projects = [p for p
72+ in matching_projects
73+ if p ['active' ] is is_active ]
74+
75+ return matching_projects
76+
77+
78+ # Instances
79+ # TODO Create an strategy to create other types of DAO
80+ project_dao = InMemoryProjectDAO ()
0 commit comments