クラスの実装
data keyの管理 - base
このdeta.spaceではdata keyが必要で、それを使ってオブジェクトを作成していきます
base.py
from deta import Deta class Base: BASE_ID = "baseのdata keyを入れる" def __init__(self): self.deta = Deta(self.BASE_ID) def openBase(self,basename): return self.deta.Base(basename) def putBase(self,listdata): self.db.put(listdata) def getBase(self,dict): return self.db.get(dict) def fetchBase(self,dict=None,limit=100,last=None): return self.db.fetch(dict,limit,last) def delBase(self,dict): self.db.delete(dict)
一応一通り作りましたが、openBaseしか使いませんでした
drive.py
from deta import Deta class Drive: DRIVE_ID = "driveのdata keyを入れる" def __init__(self): self.deta = Deta(self.DRIVE_ID) def openDrive(self,drivename): return self.deta.Drive(drivename)
deta.spaceでbaseとdriveでkeyが違うので追加しました
ユーザー管理用クラス - user
drive.py
import base class User: def __init__(self): self.db = base.Base() self.user = self.db.openBase("users") def newUser(self, userid, password): self.user.put({"id":userid,"password": password}) def getUser(self, dict): return self.user.fetch(dict)
新規ユーザーの追加と、ユーザーデータの読み込みを作りました。削除は作ってありません。データベースにusersというテーブルを作り、idとpasswordを保存します。passwordは暗号化して渡します
イベント管理用のクラス - event
event.py
import base import photoBase import driveFile import datetime import re class Event: def __init__(self): self.deta = base.Base() self.event = self.deta.openBase("events") def newEvent(self, userid, eventname, firstDay, limitdate, comment, email, paticip): t = datetime.date.today() edata = self.dirCurrentEvents(t.strftime("%Y-%m-%d")) if edata.count > 10: return False else: self.event.put({"id":userid,"eventname": eventname, "firstDay": firstDay, "limitdate": limitdate, "comment": comment,"email": email, "paticip": paticip}) return True def getEvent(self, dict): return self.event.fetch(query=dict) def updateEvent(self, key, userid, eventname, firstDay, limitdate, comment, email, paticip): self.event.put({"key": key, "id":userid,"eventname": eventname, "firstDay": firstDay, "limitdate": limitdate, "comment": comment, "email": email, "paticip": paticip}) def dirAllEvents(self): return self.event.fetch(query=None,limit=10,last=None) def deleteEvent(self, ekey): self.event.delete(ekey) def fmtDate(self,day:str,sepChar:str): l = re.findall(r"\d+", day) l = [int(s) for s in l] dt = datetime.datetime(*l) fmt = "%Y-%m-%d" fmt.replace("-",sepChar) strDay = dt.strftime(fmt) return strDay def dirCurrentEvents(self,thisDay:str): strDay = self.fmtDate(thisDay,"-") return self.event.fetch(query={"limitdate?gte":strDay},limit=10,last=None) def dirLostEvents(self,thisDay:str): strDay = self.fmtDate(thisDay,"-") return self.event.fetch(query={"limitdate?lt":strDay},limit=10,last=None) def dirEventPhotos(self,ekey,photoFlag:str): '''make relation ship to event photos and photo image''' photos = photoBase.PhotoBase() drives = driveFile.DriveFile() results = photos.photoBase.fetch(query={"eventID":ekey},limit=100,last=None) if results.items: returnList = [] for result in results.items: if photoFlag=="True": photoImage = drives.getFile(result['filename']) result['photoImage']=photoImage else: result['photoImage']="" #result['photoImage']=result['filename'] #debug returnList.append(result) return returnList else: return None
eventsというデータベーステーブルを作り、新規イベントの登録、イベント情報の取得、イベントの修正、イベントの一覧、イベントの削除、現在稼働中のイベント一覧、期限切れのイベント一覧、イベント中のファイルの一覧、を作りました
イベント参加依頼のクラス - paticip
paticip.py
import base class Paticip: def __init__(self): self.db = base.Base() self.paticip = self.db.openBase("paticip") def newRequest(self, ekey, eventname, uid, rmemo): self.paticip.put({"eventid":ekey,"eventname": eventname,"userid":uid, "rmemo":rmemo}) def getRequest(self, dict): return self.paticip.fetch(query=dict) def deleteRequest(self,pkey): self.paticip.delete(pkey)
paticipというデータベーステーブルを作り、依頼の発行、依頼の読み込み、依頼の削除を行います
画像ファイルを管理するデータベースのクラス - photoBase
photobase.py
from deta import Deta import base class PhotoBase: def __init__(self): self.deta = base.Base() self.photoBase = self.deta.openBase("photos") def getPhotoDetail(self,dict): return self.photoBase.fetch(query=dict) def newPhoto(self, fromID, eventID, fileName, deleted, datetime, accesscount, comment): self.photoBase.put({"fromid": fromID, "eventID": eventID, "filename": fileName,"deleted":deleted,"datetime":datetime, "accesscount":accesscount,"comments":comment}) def updatePhoto(self, pkey, fromID, eventID, fileName, deleted, datetime, accesscount, comment): self.photoBase.update({"fromid": fromID, "eventID": eventID, "filename": fileName,"deleted":deleted,"datetime":datetime, "accesscount":accesscount,"comments":comment},pkey) def dirPhotoNames(self): result = self.photoBase.list(limit=1000) all_files = result.get("names") paging = result.get("paging") last = paging.get("last") if paging else None while (last): result = self.photoBase.list(limit=1000,last=last) all_files += result.get("names") paging = result.get("paging") last = paging.get("last") if paging else None return all_files def deletePhoto(self,pkey): self.photoBase.delete(pkey)
photosというデータベーステーブルを作成し、画像ファイルの詳細取得、写真登録、写真情報修正、ファイル名一覧、画像ファイル削除を作成しました
ファイル管理のクラス - driveFile
drivefile.py
from deta import Deta import base64 import drive import string import random from PIL import Image #install Pillow from PIL.ExifTags import TAGS class DriveFile: def __init__(self): self.drive = drive.Drive() self.file = self.drive.openDrive("files") def putFile(self, filename, filedata): """filedata is request.file data""" self.file.put(filename,filedata) def getFile(self, filename): large_file = self.file.get( filename ) if large_file != None: image_data = b'' for chunk in large_file.iter_chunks(4096): # for chunk in large_file.iter_chunks(1024): image_data += bytearray(chunk) large_file.close() img = base64.b64encode(image_data).decode('utf-8') return img else: return None def deleteFile(self, filename): self.file.delete(filename) def get_exif_of_image(self,file): """Get EXIF of an image if exists. 指定した画像のEXIFデータを取り出す関数 @return exif_table Exif データを格納した辞書 """ im = Image.open(file) # Exif データを取得 # 存在しなければそのまま終了 空の辞書を返す try: exif = im._getexif() except AttributeError: return {} # タグIDそのままでは人が読めないのでデコードして # テーブルに格納する exif_table = {} for tag_id, value in exif.items(): tag = TAGS.get(tag_id, tag_id) exif_table[tag] = str(value) #データーで保存するとエラーが起きることがあるのでstr() #edit datetime if 'DateTime' in exif_table: string = exif_table['DateTime'] exif_table['DateTime'] = string.replace(":","/",2) else: exif_table['DateTime']="" return exif_table def randStr(self,leng): s = '' for i in range(leng): s += random.choice(string.digits + string.ascii_letters) return s
Driveにfilesというフォルダーを作成し、ファイルの出力、ファイルの読み込み(chunkで少しづつ読み込む)、ファイルの削除、指定画像ファイルから撮影日付を取得する、/tmpフォルダー用の乱数ファイル名作成を作成しました