dsite/recipe/models.py
Ching e51ab984fd fix(dodo): 修复指令识别有误的问题
修复指令识别有误的问题

Signed-off-by: Ching <loooching@gmail.com>
2022-01-21 00:54:46 +08:00

225 lines
5.9 KiB
Python

import random
from django.db import models
from django.utils.timezone import now, localtime
import datetime
from utils import const
import utils
class Recipe(models.Model):
name = models.CharField(max_length=128)
recipe_type = models.CharField(max_length=32,
default=const.RECIPE_TYPE_MEAT)
note = models.TextField(null=True)
rate = models.IntegerField(default=0)
difficulty = models.IntegerField(default=0)
def serialize(self, verbose=False):
data = {
'id': self.id,
'name': self.name,
'recipe_type': self.recipe_type,
}
if verbose:
data.update({
'difficulty': self.difficulty,
'rate': self.rate,
'note': self.note,
})
return data
@classmethod
def create_from_str(cls, content):
content = content.strip()
if not content:
return
name, *data = content.split(' ')
recipe_type = rate = difficulty = None
keys = [recipe_type, rate, difficulty]
for x in range(len(data)):
keys[x] = data[x]
recipe_type, rate, difficulty = keys
if recipe_type == '':
recipe_type = const.RECIPE_TYPE_MEAT
elif recipe_type == '':
recipe_type = const.RECIPE_TYPE_VEGETABLE
elif recipe_type == '':
recipe_type = const.RECIPE_TYPE_SOUP
else:
recipe_type = const.RECIPE_TYPE_MEAT
if rate:
try:
rate = int(rate)
except:
rate = 0
else:
rate = 0
if difficulty:
try:
difficulty = int(difficulty)
except:
difficulty = 0
else:
difficulty = 0
recipe = cls.objects.create(
name=name,
recipe_type=recipe_type,
rate=rate,
difficulty=difficulty
)
return recipe
@property
def display_recipe_type(self):
if self.recipe_type == const.RECIPE_TYPE_VEGETABLE:
return ''
elif self.recipe_type == const.RECIPE_TYPE_MEAT:
return ''
elif self.recipe_type == const.RECIPE_TYPE_SOUP:
return ''
return ''
@property
def display_rate(self):
return '🍚' * self.rate
@property
def display_difficult(self):
return '⭐️' * self.difficulty
def construct_lart_card(self):
data = {
"config": {
"wide_screen_mode": True
},
"elements": [
{
"tag": "markdown",
"content": "# **%s**\n类型:%s\n评分:%s\n难度:%s" % (
self.name, self.display_recipe_type, self.display_rate,
self.display_difficult)
},
{
"tag": "action",
"actions": [
{
"tag": "button",
"text": {
"tag": "plain_text",
"content": "查看"
},
"multi_url": {
"url": "https://recipe.tunpok.com/recipe/%s" % self.id,
"android_url": "https://recipe.tunpok.com/recipe-mobile/recipe/%s" % self.id,
"ios_url": "https://recipe.tunpok.com/recipe-mobile/recipe/%s" % self.id,
"pc_url": "https://recipe.tunpok.com/recipe/%s" % self.id
},
"type": "primary"
},
{
"tag": "button",
"text": {
"tag": "plain_text",
"content": "删除"
},
"type": "danger"
}
]
}
]
}
return data
class DailyRecipe(models.Model):
recipes = models.ManyToManyField(Recipe)
date = models.DateField()
meal_type = models.CharField(
max_length=32,
default=const.DAILY_RECIPE_MEAL_TYPE_SUPPER,)
def generate_recipe(self, prev_recipes=None, ignore_prev=False):
if not prev_recipes:
prev_recipes = []
if ignore_prev:
prev_recipes = []
recipes = []
retry = 5
# meat
for x in range(0,2):
while True:
recipe = Recipe.objects.filter(
recipe_type=const.RECIPE_TYPE_MEAT,
).order_by('?').first()
if recipe and recipe.id not in recipes and recipe.id not in prev_recipes:
recipes.append(recipe.id)
break
else:
retry -= 1
if retry <= 0:
retry = 5
break
# vegetable
for x in range(0, 1):
while True:
recipe = Recipe.objects.filter(
recipe_type=const.RECIPE_TYPE_VEGETABLE,
).order_by('?').first()
if recipe and recipe.id not in recipes and recipe.id not in prev_recipes:
recipes.append(recipe.id)
break
else:
retry -= 1
if retry <= 0:
retry = 5
break
# soup
if random.randint(0,2):
recipe = Recipe.objects.filter(
recipe_type=const.RECIPE_TYPE_SOUP,
).order_by('?').first()
# if recipe not in recipes and recipe not in prev_recipes:
if recipe:
recipes.append(recipe.id)
self.recipes.set(Recipe.objects.filter(id__in=recipes))
def serialize(self):
data = {
const.RECIPE_TYPE_MEAT: [],
const.RECIPE_TYPE_VEGETABLE: [],
const.RECIPE_TYPE_SOUP: [],
}
for key_, value_ in data.items():
for recipe in self.recipes.filter(
recipe_type=key_).order_by('id'):
value_.append(recipe.serialize())
date = now()
date = date.replace(year=self.date.year, month=self.date.month,
day=self.date.day, hour=0, minute=0)
data['date'] = utils.timestamp_of(utils.day_start(date))
data['id'] = self.id
return data
@classmethod
def get_week_recipe_data(cls):
today = localtime()
week_start = (today - datetime.timedelta(days=today.weekday())).date()
week_end = week_start + datetime.timedelta(days=6)
daily_recipes = cls.objects.filter(
date__gte=week_start,
date__lte=week_end,
).order_by('date')
data = [{}] * (7 - len(daily_recipes))
for daily_recipe in daily_recipes:
data.append(daily_recipe.serialize())
return data