Skip to content

Commit 2876e50

Browse files
committed
basic backup added
Small refactorisation - communication between backup/store and file manager is now in separate class. Next step: add the backup time to config so that users cna decide for how long do they want to keep the data.
1 parent 432326e commit 2876e50

File tree

4 files changed

+84
-79
lines changed

4 files changed

+84
-79
lines changed

dls_barcode/data_store/backup.py

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,21 @@
11
import time
22

3-
from dls_barcode.data_store.record import Record
4-
from dls_util.file import FileManager
3+
from dls_barcode.data_store.comms_manager import CommsManager
54

65

76
class Backup:
87

9-
def __init__(self, backup_file):
10-
self._backup_file = backup_file
11-
self._file_manager = FileManager()
12-
self._load_records_from_file()
8+
"""
9+
Backup class maintains the short time backaup of records which is kept in the same folder as the store files.
10+
"""
1311

14-
def _load_records_from_file(self):
15-
""" Clear the current record store and load a new set of records from the specified file. """
16-
self.records = []
12+
MAX_BACKUP_TIME = 6 # maximum backup time in weeks
1713

18-
if not self._file_manager.is_file(self._backup_file):
19-
return
20-
21-
lines = self._file_manager.read_lines(self._backup_file)
22-
for line in lines:
23-
try:
24-
record = Record.from_string(line)
25-
self.records.append(record)
26-
except Exception:
27-
print("Failed to parse store Record: {}".format(line))
28-
29-
#self._truncate_record_list()
30-
31-
def _to_backup_file(self):
32-
""" Save the contents of the store to the backing file
33-
"""
34-
record_lines = [rec.to_string() + "\n" for rec in self.records]
35-
self._file_manager.write_lines(self._backup_file, record_lines)
14+
def __init__(self, directory, backup_time):
15+
self.comms = CommsManager(directory, "backup")
16+
self.backup_time = backup_time
17+
self.records = self.comms.load_records_from_file()
18+
self._truncate_record_list()
3619

3720
def _truncate_record_list(self):
3821
for record in self.records:
@@ -42,12 +25,13 @@ def _truncate_record_list(self):
4225
def backup_records(self, to_back):
4326
self.records.extend(to_back)
4427
self._truncate_record_list()
45-
self._to_backup_file()
28+
self.comms.to_csv_file(self.records)
4629

47-
def _is_old(self,record):
30+
def _is_old(self, record):
4831
tm = time.time()
4932
record_time = record.timestamp
5033
delta = tm - record_time
51-
weeks = 3 * 604800 #3 weeks in seconds
34+
backup_time = min(self.backup_time, self.MAX_BACKUP_TIME)
35+
weeks = backup_time * 604800 # weeks in seconds
5236
return delta > weeks
5337

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import os
2+
3+
from dls_barcode.data_store.record import Record
4+
from dls_util.file import FileManager
5+
6+
7+
class CommsManager:
8+
""" Maintains communication between store/backup and the file manager.
9+
"""
10+
11+
def __init__(self, directory, file_name):
12+
self._file_manager = FileManager()
13+
self._directory = directory
14+
self._file_name = file_name
15+
16+
def load_records_from_file(self):
17+
""" Clear the current record store and load a new set of records from the specified file. """
18+
file = os.path.join(self._directory, self._file_name + '.txt')
19+
records = []
20+
21+
if not self._file_manager.is_file(file):
22+
return records
23+
24+
lines = self._file_manager.read_lines(file)
25+
for line in lines:
26+
try:
27+
record = Record.from_string(line)
28+
records.append(record)
29+
except Exception:
30+
print("Failed to parse store Record: {}".format(line))
31+
32+
return records
33+
34+
def to_file(self, records):
35+
""" Save the contents of the store to the backing file
36+
"""
37+
file = os.path.join(self._directory, self._file_name + '.txt')
38+
record_lines = [rec.to_string() + "\n" for rec in records]
39+
self._file_manager.write_lines(file, record_lines)
40+
41+
def to_csv_file(self, records):
42+
""" Save the contents of the store to the backing csv file
43+
"""
44+
csv_file = os.path.join(self._directory, self._file_name + ".csv")
45+
record_lines = [rec.to_csv_string() + "\n" for rec in records]
46+
self._file_manager.write_lines(csv_file, record_lines)
47+
48+
def make_img_dir(self, img_dir):
49+
if not self._file_manager.is_dir(img_dir):
50+
self._file_manager.make_dir(img_dir)
51+
52+
def remove_img_file(self, record):
53+
if self._file_manager.is_file(record.image_path):
54+
self._file_manager.remove(record.image_path)

dls_barcode/data_store/store.py

Lines changed: 15 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,48 +2,29 @@
22
import os
33

44
from dls_barcode.data_store.backup import Backup
5-
from dls_util.file import FileManager
5+
from dls_barcode.data_store.comms_manager import CommsManager
66
from .record import Record
77

88

99
class Store:
10+
1011
""" Maintains a list of records of previous barcodes scans. Any changes (additions
1112
or deletions) are automatically written to the backing file.
1213
"""
13-
def __init__(self, directory, store_capacity):
14+
MIN_STORE_CAPACITY = 2
15+
16+
def __init__(self, directory, store_capacity, backup_time):
1417
""" Initializes a new instance of Store.
1518
"""
1619
self._store_capacity = store_capacity
17-
self._directory = directory
18-
self._file_manager = FileManager()
19-
self._file = os.path.join(directory, "store.txt")
20-
self._csv_file = os.path.join(directory, "store.csv")
21-
self._backup = Backup(os.path.join(directory, "backup.txt"))
20+
self._backup = Backup(directory, backup_time)
21+
self._comms_manager = CommsManager(directory, "store")
2222
self._img_dir = os.path.join(directory, "img_dir")
23+
self._comms_manager.make_img_dir(self._img_dir)
2324

24-
if not self._file_manager.is_dir(self._img_dir):
25-
self._file_manager.make_dir(self._img_dir)
26-
27-
self.records = []
28-
self._load_records_from_file()
29-
self._sort_records()
30-
31-
def _load_records_from_file(self):
32-
""" Clear the current record store and load a new set of records from the specified file. """
33-
self.records = []
34-
35-
if not self._file_manager.is_file(self._file):
36-
return
37-
38-
lines = self._file_manager.read_lines(self._file)
39-
for line in lines:
40-
try:
41-
record = Record.from_string(line)
42-
self.records.append(record)
43-
except Exception:
44-
print("Failed to parse store Record: {}".format(line))
45-
25+
self.records = self._comms_manager.load_records_from_file()
4626
self._truncate_record_list()
27+
self._sort_records()
4728

4829
def size(self):
4930
""" Returns the number of records in the store
@@ -82,17 +63,16 @@ def delete_records(self, records_to_delete):
8263
"""
8364
for record in records_to_delete:
8465
self.records.remove(record)
85-
if self._file_manager.is_file(record.image_path):
86-
self._file_manager.remove(record.image_path)
66+
self._comms_manager.remove_img_file(record)
8767

8868
self._process_change()
8969

9070
def backup_records(self, records_to_backup):
9171
self._backup.backup_records(records_to_backup)
9272

9373
def _truncate_record_list(self):
94-
min_store_capacity = 2
95-
actual_store_capacity = max(self._store_capacity.value(), min_store_capacity)
74+
75+
actual_store_capacity = max(self._store_capacity.value(), self.MIN_STORE_CAPACITY)
9676

9777
if len(self.records) > actual_store_capacity:
9878
to_delete = self.records[actual_store_capacity:]
@@ -104,27 +84,14 @@ def _process_change(self):
10484
"""
10585
self._sort_records()
10686
self._truncate_record_list()
107-
self._to_file()
108-
self._to_csv_file()
87+
self._comms_manager.to_file(self.records)
88+
self._comms_manager.to_csv_file(self.records)
10989

11090
def _sort_records(self):
11191
""" Sort the records in descending date order (most recent first).
11292
"""
11393
self.records.sort(reverse=True, key=lambda record: record.timestamp)
11494

115-
def _to_file(self):
116-
""" Save the contents of the store to the backing file
117-
"""
118-
record_lines = [rec.to_string() + "\n" for rec in self.records]
119-
self._file_manager.write_lines(self._file, record_lines)
120-
121-
def _to_csv_file(self):
122-
""" Save the contents of the store to the backing csv file
123-
"""
124-
record_lines = [rec.to_csv_string() + "\n" for rec in self.records]
125-
self._file_manager.write_lines(self._csv_file, record_lines)
126-
127-
12895
def _merge_holder_image_into_pins_image(self, holder_img, pins_img):
12996
factor = 0.22 * pins_img.width / holder_img.width
13097
small_holder_img = holder_img.rescale(factor)

dls_barcode/gui/record_table.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def __init__(self, barcode_table, image_frame, options):
2222
super(ScanRecordTable, self).__init__()
2323

2424
# Read the store from file
25-
self._store = Store(options.store_directory.value(), options.store_capacity)
25+
self._store = Store(options.store_directory.value(), options.store_capacity, 3)#options.backup_time
2626
self._options = options
2727

2828
self._barcodeTable = barcode_table

0 commit comments

Comments
 (0)