| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- import datetime
- import pickle
- import random
- import sys
- import time
- from hashlib import md5
- from os import listdir
- class Base:
- def __init__(self):
- self.create_time = time.time()
- self.create_date: datetime.datetime = datetime.datetime.utcfromtimestamp(
- self.create_time)
- self.str_time = time.strftime(
- "%Y%m%d%H%M%S", time.gmtime(self.create_time))
- self.__gene_id()
- def __gene_id(self):
- self.__id_seed: str = self.str_time + str(random.randint(10000, 99999))
- self.id: str = md5(self.__id_seed.encode("UTF-8")).hexdigest()
- class Entry(Base):
- def __init__(self, title: str = "未命名事项"):
- Base.__init__(self)
- if title == "未命名事项":
- self.title: str = title + self.str_time[4:8]
- else:
- self.title: str = title
- self.content: str = "在这里输入事项内容"
- self.set_priority()
- self.set_start_date()
- self.set_deadline(self.create_date + datetime.timedelta(days=7))
- self.sub_entries_dict: dict = {}
- def set_priority(self, priority: float = 0):
- if priority < -10:
- print("最低优先级为-10,已自动设置为-10")
- priority = -10.0
- elif priority > 10:
- print("最高优先级为10,已自动设置为10")
- priority = 10.0
- self.priority: float = priority
- def set_deadline(self, deadline_date: datetime.datetime):
- """This function will set the entry's deadline date
- Args:
- deadline_date (float): The deadline date must be datetime structure.
- Returns:
- bool : If successfully set the deadline will return 0, else 1.
- """
- if deadline_date < self.start_date:
- print("\033[1;31mERROR: Let it RIP if it's dead already\033[0m")
- return 1
- else:
- self.deadline = deadline_date
- return 0
- def set_start_date(self, start_date: datetime.datetime = datetime.datetime(1970, 1, 1, 0, 0, 0)):
- if start_date == datetime.datetime(1970, 1, 1, 0, 0, 0):
- self.start_date = self.create_date
- else:
- self.start_date = start_date
- def set_content(self, content: str):
- self.content = content
- def timestamp_converter(self, time_in):
- """This function can convert timestamp to date string and do reversely.
- Args:
- time_in (float/ str): Timestamp as float or date string like "YYYY/mm/dd HH:MM".
- Returns:
- timestamp or date string.
- """
- try:
- _time_in = float(time_in)
- return datetime.datetime.utcfromtimestamp(_time_in)
- except ValueError:
- return time.mktime(time.strptime(time_in, "%Y/%m/%d %H:%M"))
- class Coordinate(Base):
- def __init__(self):
- Base.__init__(self)
- self.name = "未命名坐标系" + self.str_time
- # Base.__gene_id(self)
- self.entries_dict = {}
- self.entries_num = 0
- def show_entries(self):
- print(self.entries_dict)
- def add_entry(self, entry_in: Entry):
- self.entries_dict[entry_in.id] = entry_in
- self.entries_num += 1
- def del_entry(self, entry_in: Entry):
- try:
- del self.entries_dict[entry_in.id]
- self.entries_num -= 1
- except KeyError:
- print("\033[1;31mERROR: Entry doesn't exist\033[0m")
- def save_coord(self):
- with open("coord/" + self.name + ".crd", "wb") as f:
- pickle.dump(self, f, pickle.HIGHEST_PROTOCOL)
- def __str__(self) -> str:
- return (
- "Title: "
- + self.name
- + "\nId: "
- + self.id
- + "\nEntries number: "
- + str(self.entries_num)
- )
- class Interface:
- def __init__(self):
- self.coordinate_dict: dict = {}
- self.exit: bool = False
- self.func_dict = {
- "exit": self.__exit,
- "open": self.__open_coord,
- "ls": self.__list_coord,
- "show": self.__show_now_coord,
- "entry": self.__new_entry,
- "chcrd": self.__coord_changer,
- }
- def start(self):
- print(
- "*******************************\n*Welcome to Jt mission manager*\n*******************************\n"
- )
- self.__coord_changer([])
- while not (self.exit):
- command = input("\033[1;32m> \033[0m").split()
- try:
- func_name = command[0]
- try:
- func = self.func_dict[func_name]
- func(command[1:])
- except KeyError:
- print("\033[1;31mERROR: Command not found\033[0m")
- except IndexError:
- pass
- def __open_coord(self, coord_file: str):
- with open(coord_file, "rb") as f:
- self.now_coord: Coordinate = pickle.load(f)
- def __list_coord(self):
- self.files = listdir("coord")
- if self.files:
- i = 0
- for f in self.files:
- print(i, f)
- i += 1
- def __save_now_coord(self):
- save_or_not: str = input("Save the opened coordinate? Y/n")
- if save_or_not in ["Y", "y", "1"]:
- self.now_coord.save_coord()
- return 0
- elif save_or_not in ["N", "n", "0"]:
- return 0
- else:
- self.__save_now_coord()
- def __coord_changer(self, arg: list):
- try:
- self.now_coord
- self.__save_now_coord()
- except AttributeError:
- pass
- print("Select a coordinate to open:")
- self.__list_coord()
- coord_file = self.files[
- int(input("\033[1;32mType in the coordinate number:\033[0m"))
- ]
- self.__open_coord("coord/" + coord_file)
- def __new_entry(self, arg: list):
- e = Entry(arg[0])
- print("Input the content of this entry, use \"Ctrl+D\" to end.\n")
- e.content = "\n".join(sys.stdin.readlines())
- print(e.content)
- def __new_coord(self, arg: list):
- c = Coordinate()
- c.name = arg[0]
- raise NotImplementedError
- def __show_now_coord(self, arg: list):
- print(self.now_coord)
- def __add_coordinate(self, c: Coordinate):
- if not c.id in self.coordinate_dict:
- self.coordinate_dict[c.id] = c
- else:
- print("\033[1;31mERROR: It's already in there\033[0m")
- def __exit(self, arg):
- self.exit = True
- def main():
- i = Interface()
- i.start()
- if __name__ == "__main__":
- main()
|