diff --git a/snuseggi/models.py b/snuseggi/models.py index fd70d90..cbc7f8f 100644 --- a/snuseggi/models.py +++ b/snuseggi/models.py @@ -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) \ No newline at end of file +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 \ No newline at end of file diff --git a/snuseggi/parsing.py b/snuseggi/parsing.py new file mode 100644 index 0000000..b86ee26 --- /dev/null +++ b/snuseggi/parsing.py @@ -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 \ No newline at end of file diff --git a/snuseggi/templates/snuseggi/review_list.html b/snuseggi/templates/snuseggi/review_list.html new file mode 100644 index 0000000..977f8ed --- /dev/null +++ b/snuseggi/templates/snuseggi/review_list.html @@ -0,0 +1,19 @@ + + + {{restaurant}} + + +
+

☆★{{restaurant}}★☆

+

---------------

+

아침 : {{breakfast}}

+

평점 : {{point_breakfast}}

+

---------------

+

점심 : {{lunch}}

+

평점 : {{point_lunch}}

+

---------------

+

저녁 : {{dinner}}

+

평점 : {{point_dinner}}

+
+ + \ No newline at end of file diff --git a/snuseggi/views.py b/snuseggi/views.py index 6878787..db33145 100644 --- a/snuseggi/views.py +++ b/snuseggi/views.py @@ -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]}) \ No newline at end of file