Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 33 additions & 70 deletions snuseggi/models.py
Original file line number Diff line number Diff line change
@@ -1,70 +1,33 @@
from django.db import models
from datetime import datetime

ZERO = 0
ONE = 1
TWO = 2
THREE = 3
FOUR = 4
FIVE = 5
POINT_CHOICES = (
(ZERO, '0'),
(ONE, '1'),
(TWO, '2'),
(THREE, '3'),
(FOUR, '4'),
(FIVE, '5'),)

CLASSIFICATION = (('Lunch', 'Lunch'), ('Dinner', 'Dinner'),)

class Menu(models.Model):
name = models.CharField(max_length = 50, primary_key = True)

def __str__(self):
return self.name

class Restaurant(models.Model):
name = models.CharField(max_length = 50, primary_key = True)
menus = models.ManyToManyField(Menu, through='DailyMenu')
point_taste = models.PositiveSmallIntegerField(default = 0, choices = POINT_CHOICES)
point_service = models.PositiveSmallIntegerField(default = 0, choices = POINT_CHOICES)
point_price = models.PositiveSmallIntegerField(default = 0, choices = POINT_CHOICES)
point_average = models.FloatField(default = 0)

def point_avg(self):
return (self.point_taste + self.point_service + self.point_price) / 3

def __str__(self):
return self.name

class DailyMenu(models.Model):
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
date = models.DateField(default = datetime.today)
classification = models.CharField(max_length=6, choices = CLASSIFICATION, default = 'Lunch')

def __str__(self):
return str(self.date) + " " + self.restaurant.name + " " + self.classification + " " + self.menu.name

def __rst__(self):
return self.restaurant.pk

class Assessment(models.Model):
restaurant = models.ForeignKey(Restaurant, blank=False, null=False, default = '301동')
classification = models.CharField(max_length=6, choices = CLASSIFICATION, default = 'Lunch')
date = models.DateField(default = datetime.today)
dailyMenu = models.ForeignKey(DailyMenu, blank=False, null=False)
save_time = models.DateTimeField(default = datetime.now)
point_taste = models.PositiveSmallIntegerField(choices = POINT_CHOICES, blank=False, null=False, default = 5)
point_service = models.PositiveSmallIntegerField(choices = POINT_CHOICES, blank=False, null=False, default = 5)
point_price = models.PositiveSmallIntegerField(choices = POINT_CHOICES, blank=False, null=False, default = 5)
comment = models.CharField(max_length = 200, blank=True, null=True)

def __str__(self):
return str(self.date) + " " + str(self.save_time)


class Select(models.Model):
restaurant = models.ForeignKey(Restaurant, blank=False, null=False, default = '301동')
classification = models.CharField(max_length=6, choices = CLASSIFICATION, default = 'Lunch')
date = models.DateField(default = datetime.today)
from django.db import models

class Menu(models.Model):
name = models.CharField(max_length = 50, primary_key = True)

def __str__(self):
return self.name

class Restaurant(models.Model):
name = models.CharField(max_length = 50, primary_key = True)
point_taste = models.PositiveSmallIntegerField(default = 0)
point_service = models.PositiveSmallIntegerField(default = 0)
point_price = models.PositiveSmallIntegerField(default = 0)

def point_avg(self):
return (self.point_taste + self.point_service + self.point_price) / 3

def __str__(self):
return self.name

class Assessment(models.Model):
CLASSIFICATION = (('L', 'Lunch'), ('D', 'Dinner'),)
restuarant = models.ForeignKey('Restaurant')
classification = models.CharField(max_length=1, choices = CLASSIFICATION, default = 'L')
menus = models.ManyToManyField(Menu)
date = models.DateField(auto_now = True)
point_taste = models.PositiveSmallIntegerField(default = 0)
point_service = models.PositiveSmallIntegerField(default = 0)
point_price = models.PositiveSmallIntegerField(default = 0)
comment = models.CharField(max_length = 200)

#def __str__(self):
# return self.menus.name
45 changes: 45 additions & 0 deletions snuseggi/parsing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import urllib.request
from bs4 import BeautifulSoup

# input : 식당이름
# 아래의 snuYes, snuNo의 문자열값을 따라야함.

def menulist(input):

snuYes = ['학생회관식당학생회관(63동)', '3식당전망대(75-1동)', '기숙사식당관악사(919동)', '자하연식당농협(109동)',
'302동식당302동', '솔밭간이식당110동', '동원관식당113동', '감골식당101동']

snuNo = ['4식당서당골 (76동)', '두레미담75-1동', '301동식당301동', '예술계식당(74동)75동', '샤반501동',
'공대간이식당30-2동', '상아회관연건켐퍼스 19동', '소담마루동원생활관 113동 3층', '220동식당3단계대학원연구동(220동)',
'라운지오동원생활관(113동) 1층']

if input in snuYes:
menuURL = 'http://www.snuco.com/html/restaurant/restaurant_menu1.asp'
restaurantNum = snuYes.index(input)
elif input in snuNo:
menuURL = 'http://www.snuco.com/html/restaurant/restaurant_menu2.asp'
restaurantNum = snuNo.index(input)
else:
return 'ERROR'

# 디버깅용으로 날짜변경시
menuURL = menuURL + '?date=2016-06-14'

html = urllib.request.urlopen(menuURL)
soup = BeautifulSoup(html, "html.parser")

table = soup.find('table', attrs={'width':'586px'})
table_body = table.find('tbody')
rows = table_body.find_all('tr')
cols = rows[restaurantNum+1].find_all('td')
data = [ele.text.strip() for ele in cols if ele]

#식당이름제거
del data[0]

# '/'가 포함된 시간대는 편의상 제일 앞 메뉴만 표시
data = [iter.split('/')[0][1:] for iter in data]
# 1아침 3점심 5저녁
data = [data[1], data[3], data[5]]

return data
19 changes: 19 additions & 0 deletions snuseggi/templates/snuseggi/review_list.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<html>
<head>
<title>{{restaurant}}</title>
</head>
<body>
<div>
<p>☆★{{restaurant}}★☆</p>
<p>---------------</p>
<p>아침 : {{breakfast}}</p>
<p>평점 : {{point_breakfast}}</p>
<p>---------------</p>
<p>점심 : {{lunch}}</p>
<p>평점 : {{point_lunch}}</p>
<p>---------------</p>
<p>저녁 : {{dinner}}</p>
<p>평점 : {{point_dinner}}</p>
</div>
</body>
</html>
104 changes: 38 additions & 66 deletions snuseggi/views.py
Original file line number Diff line number Diff line change
@@ -1,66 +1,38 @@
from django.shortcuts import render, get_object_or_404
from django.shortcuts import redirect
from .models import Restaurant
from .models import Assessment
from .models import Menu
from .models import DailyMenu
from .forms import AssessForm
from .forms import AssessForm_sel
from .forms import SelectForm
from django.http import HttpResponse
from django.db.models import Avg
from decimal import *
from tkinter.constants import NUMERIC

import logging
logger = logging.getLogger(__name__)

import pytz
from django.utils import timezone

# Create your views here.
# Create your views here.
def restaurants(request):
restaurant_list = Restaurant.objects.all()
for rest in restaurant_list:
avg_taste = Assessment.objects.filter(restaurant__name=rest.name).aggregate(avg_taste=Avg('point_taste')).get('avg_taste',0.0)
avg_service = Assessment.objects.filter(restaurant__name=rest.name).aggregate(avg_service=Avg('point_service')).get('avg_service',0.0)
avg_price = Assessment.objects.filter(restaurant__name=rest.name).aggregate(avg_price=Avg('point_price')).get('avg_price',0.0)
if(avg_taste == None):
avg_taste = 0
if(avg_service == None):
avg_service = 0
if(avg_price == None):
avg_price = 0
rest.point_taste = avg_taste
rest.point_service = avg_service
rest.point_price = avg_price
rest.point_average = rest.point_avg()
rest.save()
restaurant_list.order_by('-point_average')
return render(request, 'snuseggi/restaurants.html', {'restaurant_list' : restaurant_list})

def assessments(request):
assessment_list = Assessment.objects.all().order_by('save_time')
return render(request, 'snuseggi/assessments.html', {'assessment_list' : assessment_list})

def asst_detail(request, pk):
if request.method == "POST":
return redirect('/main')
else:
asst = get_object_or_404(Assessment, pk=pk)
return render(request, 'snuseggi/asst_detail.html', {'asst': asst})

def write(request):
if request.method == "POST":
form = AssessForm(request.POST, rest = request.POST['restaurant'], clsf = request.POST['classification'], date = request.POST['date'])
if form.is_valid():
assess = form.save(commit = False)
assess.save()
#form.save()
#return render(request, 'snuseggi/writeForm.html', {'form': form})
return redirect('snuseggi.views.asst_detail', pk = assess.pk)
#return redirect('snuseggi.views.write', {form : 'form'})
else:
form = AssessForm_sel()
return render(request, 'snuseggi/selectForm.html', {'form': form})
from django.shortcuts import render
from .models import Restaurant
from .models import Assessment
from .models import Menu
from .parsing import menulist

# Create your views here.
def restaurants(request):
restaurant_list = Restaurant.objects.all().order_by('name')
return render(request, 'snuseggi/restaurants.html', {'restaurant_list' : restaurant_list})

def assessments(request):
assessment_list = Assessment.objects.all().order_by('date')
return render(request, 'snuseggi/assessments.html', {'assessment_list' : assessment_list})

# input : name of restaurant
def review_list(request):
input='기숙사식당관악사(919동)'
today_menus = menulist(input)

point_of_menu = []
starlist = ['☆☆☆☆☆', '★☆☆☆☆', '★★☆☆☆', '★★★☆☆', '★★★★☆', '★★★★★']
for iter in range(0,3):
current_menu = Menu.objects.filter(name=today_menus[iter])
current_review_list = Assessment.objects.filter(menus=current_menu)

sum_of_taste = 0
for review_in_list in current_review_list:
sum_of_taste = sum_of_taste + review_in_list.point_taste

if len(current_review_list) == 0:
point_of_menu.append('평가없음')
else:
point_of_menu.append(starlist[round(sum_of_taste / len(current_review_list))])

return render(request, 'snuseggi/review_list.html', {'restaurant' : input, 'breakfast': today_menus[0], 'lunch' : today_menus[1],
'dinner' : today_menus[2], 'point_breakfast' : point_of_menu[0],
'point_lunch' : point_of_menu[1], 'point_dinner' : point_of_menu[2]})