|
5 | 5 |
|
6 | 6 |
|
7 | 7 | class Store: |
| 8 | + |
8 | 9 | """ Maintains a list of records of previous barcodes scans. Any changes (additions |
9 | 10 | or deletions) are automatically written to the backing file. |
10 | 11 | """ |
11 | | - def __init__(self, directory, store_capacity, file_manager): |
| 12 | + MIN_STORE_CAPACITY = 2 |
| 13 | + |
| 14 | + def __init__(self, comms_manager, backup, store_capacity): |
12 | 15 | """ Initializes a new instance of Store. |
13 | 16 | """ |
14 | 17 | self._store_capacity = store_capacity |
15 | | - self._directory = directory |
16 | | - self._file_manager = file_manager |
17 | | - self._file = os.path.join(directory, "store.txt") |
18 | | - self._csv_file = os.path.join(directory, "store.csv") |
19 | | - self._img_dir = os.path.join(directory, "img_dir") |
20 | | - |
21 | | - if not self._file_manager.is_dir(self._img_dir): |
22 | | - self._file_manager.make_dir(self._img_dir) |
23 | | - |
24 | | - self.records = [] |
25 | | - self._load_records_from_file() |
26 | | - self._sort_records() |
27 | | - |
28 | | - def _load_records_from_file(self): |
29 | | - """ Clear the current record store and load a new set of records from the specified file. """ |
30 | | - self.records = [] |
31 | | - |
32 | | - if not self._file_manager.is_file(self._file): |
33 | | - return |
34 | | - |
35 | | - lines = self._file_manager.read_lines(self._file) |
36 | | - for line in lines: |
37 | | - try: |
38 | | - record = Record.from_string(line) |
39 | | - self.records.append(record) |
40 | | - except Exception: |
41 | | - print("Failed to parse store Record: {}".format(line)) |
42 | | - |
| 18 | + self._backup = backup |
| 19 | + self._comms_manager = comms_manager |
| 20 | + self._img_dir = self._comms_manager.make_img_dir() |
| 21 | + self.records = self._comms_manager.load_records_from_file() |
43 | 22 | self._truncate_record_list() |
| 23 | + self._sort_records() |
44 | 24 |
|
45 | 25 | def size(self): |
46 | 26 | """ Returns the number of records in the store |
@@ -79,44 +59,35 @@ def delete_records(self, records_to_delete): |
79 | 59 | """ |
80 | 60 | for record in records_to_delete: |
81 | 61 | self.records.remove(record) |
82 | | - if self._file_manager.is_file(record.image_path): |
83 | | - self._file_manager.remove(record.image_path) |
| 62 | + self._comms_manager.remove_img_file(record) |
84 | 63 |
|
85 | 64 | self._process_change() |
86 | 65 |
|
| 66 | + def backup_records(self, records_to_backup): |
| 67 | + self._backup.backup_records(records_to_backup) |
| 68 | + |
87 | 69 | def _truncate_record_list(self): |
88 | | - min_store_capacity = 2 |
89 | | - actual_store_capacity = max(self._store_capacity.value(), min_store_capacity) |
| 70 | + |
| 71 | + actual_store_capacity = max(self._store_capacity.value(), self.MIN_STORE_CAPACITY) |
90 | 72 |
|
91 | 73 | if len(self.records) > actual_store_capacity: |
92 | 74 | to_delete = self.records[actual_store_capacity:] |
| 75 | + self.backup_records(to_delete) |
93 | 76 | self.delete_records(to_delete) |
94 | 77 |
|
95 | 78 | def _process_change(self): |
96 | 79 | """ Sort the records and save to file. |
97 | 80 | """ |
98 | 81 | self._sort_records() |
99 | 82 | self._truncate_record_list() |
100 | | - self._to_file() |
101 | | - self._to_csv_file() |
| 83 | + self._comms_manager.to_file(self.records) |
| 84 | + self._comms_manager.to_csv_file(self.records) |
102 | 85 |
|
103 | 86 | def _sort_records(self): |
104 | 87 | """ Sort the records in descending date order (most recent first). |
105 | 88 | """ |
106 | 89 | self.records.sort(reverse=True, key=lambda record: record.timestamp) |
107 | 90 |
|
108 | | - def _to_file(self): |
109 | | - """ Save the contents of the store to the backing file |
110 | | - """ |
111 | | - record_lines = [rec.to_string() + "\n" for rec in self.records] |
112 | | - self._file_manager.write_lines(self._file, record_lines) |
113 | | - |
114 | | - def _to_csv_file(self): |
115 | | - """ Save the contents of the store to the backing csv file |
116 | | - """ |
117 | | - record_lines = [rec.to_csv_string() + "\n" for rec in self.records] |
118 | | - self._file_manager.write_lines(self._csv_file, record_lines) |
119 | | - |
120 | 91 | def _merge_holder_image_into_pins_image(self, holder_img, pins_img): |
121 | 92 | factor = 0.22 * pins_img.width / holder_img.width |
122 | 93 | small_holder_img = holder_img.rescale(factor) |
|
0 commit comments