写真配布サイトのクラス

必要なクラスを作っていく

クラスの実装

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フォルダー用の乱数ファイル名作成を作成しました