def AddEntry(self, start_date, stop_date, message): if not isinstance(start_date, datetime): return False, 'start date must be a datetime object' if not isinstance(stop_date, datetime): return False, 'stop date must be a datetime object' if '\n' in message: return False, 'message cannot have newline characters' # TODO cache recent entry hashes # check for duplicate entries new_hash = hash(util.date2string(start_date)+util.date2string(stop_date)) for row in reversed(self.entries): item_start = row[0] item_stop = row[1] item_hash = hash(item_start+item_stop) if new_hash == item_hash: return False, "duplicate entry" with open(self.filename, 'ab+') as csvfile: writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator='\n') writer.writerow([util.date2string(start_date), util.date2string(stop_date), message]) # force reread of timesheet self._entries = None return True, ''
def eternity(self, mbox_file): print "importing app's csv timesheets from mailbox" print "mailbox: " + mbox_file print "" # open and lock the mailbox mbox = mailbox.mbox(mbox_file, create=False) mbox.lock() imported = 0 try: for key, msg in mbox.iteritems(): if msg["subject"].startswith("Eternity"): for part in msg.walk(): # assume its multipart by its subject if part.get_content_type() == "text/csv" and "_logs_" in part.get_filename(): sio = StringIO.StringIO(part.get_payload()) reader = csv.reader(sio, delimiter=",") for f in reader: if not f[0] == "day": if len(f) >= 8: print "importing " + str(f) startdate = util.string2date(f[0] + " " + f[1]) d = f[3].split(":") hours = int(d[0]) minutes = int(d[1]) seconds = int(d[2]) delta = timedelta(hours=hours, minutes=minutes, seconds=seconds) enddate = startdate + delta tag = f[7] note = f[6] message = "" if len(tag) > 0: message = tag if len(note) > 0: message += ", " message = message + note added, msg = self.timesheet_log.AddEntry(startdate, enddate, message) if added: print "added entry: " + util.date2string(startdate), util.date2string( enddate ), message print "" imported += 1 else: print msg # mbox.remove(key) finally: mbox.flush() mbox.close() mbox.unlock() if imported == 0: print "nothing to import" else: print "imported " + str(imported) + " entries"
def Set(self, start_time, message = ''): assert isinstance(start_time, datetime) assert isinstance(message, str) # TODO check that message is a string with open(self.filename, 'w') as fh: fh.write('timesheet.state\n') fh.write(util.date2string(start_time)) fh.write('\n') if message != '': fh.write(message); fh.write('\n')