Commit 4ea9806a764507246286a8f18f2f8cb2a7866bcb
1 parent
24c02613
Exists in
master
and in
1 other branch
Integration with real recommender code. Content-based strategy is the only one
enabled. Edited templates and forms.
Showing
2 changed files
with
101 additions
and
57 deletions
Show diff stats
| ... | ... | @@ -3,15 +3,13 @@ |
| 3 | 3 | import web |
| 4 | 4 | from web import form |
| 5 | 5 | import tempfile |
| 6 | +import sys | |
| 6 | 7 | |
| 7 | -render = web.template.render('templates/', base='layout') | |
| 8 | +sys.path.insert(0,"../") | |
| 8 | 9 | |
| 9 | -urls = ('/', 'Index', | |
| 10 | - '/feedback', 'FeedbackForm', | |
| 11 | - '/thanks', 'FeedbackThanks' | |
| 12 | - ) | |
| 13 | - | |
| 14 | -web.webapi.internalerror = web.debugerror | |
| 10 | +from config import * | |
| 11 | +from recommender import * | |
| 12 | +from user import * | |
| 15 | 13 | |
| 16 | 14 | def add_global_hook(): |
| 17 | 15 | g = web.storage({"counter": "1"}) |
| ... | ... | @@ -20,29 +18,29 @@ def add_global_hook(): |
| 20 | 18 | return handler() |
| 21 | 19 | return _wrapper |
| 22 | 20 | |
| 23 | - | |
| 24 | -if __name__ == "__main__": | |
| 25 | - app = web.application(urls, globals()) | |
| 26 | - app.add_processor(add_global_hook()) | |
| 27 | - app.run() | |
| 28 | - | |
| 29 | 21 | class Index: |
| 30 | 22 | def GET(self): |
| 31 | - action = "/feedback" | |
| 32 | - method = "post" | |
| 33 | - return render.index(action, method, self._form()) | |
| 23 | + form_action = "/feedback" | |
| 24 | + form_method = "post" | |
| 25 | + form = self._form() | |
| 26 | + return render.index(form_action, form_method, form) | |
| 34 | 27 | |
| 35 | 28 | def _form(self): |
| 36 | 29 | send_form = form.Form( |
| 37 | - form.File("myfile", description="Packages list"), | |
| 38 | - form.Dropdown('Limit results', [('5', '05'), ('10', '10'), ('20', '20')]), | |
| 39 | - form.Checkbox("strategy_1", value="True", checked=True, description="Strategy 1"), | |
| 40 | - form.Checkbox("strategy_2", value="True", checked=True, description="Strategy 2"), | |
| 41 | - form.Checkbox("strategy_3", value="True", checked=True, description="Strategy 3"), | |
| 42 | - form.Checkbox("strategy_4", value="True", checked=True, description="Strategy 4"), | |
| 43 | - form.Checkbox("strategy_5", value="True", checked=True, description="Strategy 5"), | |
| 44 | - form.Checkbox("strategy_6", value="True", checked=True, description="Strategy 6"), | |
| 45 | - | |
| 30 | + form.File("pkgs_file", description="Packages list"), | |
| 31 | + form.Dropdown('limit', [('5', '05'), ('10', '10'), ('20', '20')], | |
| 32 | + description = "Limit"), | |
| 33 | + form.Checkbox("strategy_cb", value="True", checked=False, | |
| 34 | + description="Content-based"), | |
| 35 | + form.Checkbox("strategy_col", value="True", checked=False, | |
| 36 | + description="Collaborative"), | |
| 37 | + form.Checkbox("strategy_hybrid", value="True", checked=False, | |
| 38 | + description="Hybrid"), | |
| 39 | + form.Checkbox("strategy_hybrid_plus", value="True", checked=False, | |
| 40 | + description="Hybrid plus"), | |
| 41 | + validators = [form.Validator("You must select at least one strategy", | |
| 42 | + lambda i: i.strategy_cb | i.startegy_col | | |
| 43 | + i.strategy_hybrid | i.strategy_hybrid_plus)] | |
| 46 | 44 | ) |
| 47 | 45 | return send_form() |
| 48 | 46 | |
| ... | ... | @@ -50,32 +48,63 @@ class FeedbackForm: |
| 50 | 48 | def POST(self): |
| 51 | 49 | action = "/thanks" |
| 52 | 50 | method = "post" |
| 53 | - outputdir = tempfile.mkdtemp() + '/' | |
| 54 | - x = web.input(myfile={}) | |
| 55 | - f = open(outputdir + x['myfile'].filename, "wb") | |
| 56 | - content = x['myfile'].value | |
| 57 | - while 1: | |
| 58 | - chunk = x['myfile'].file.read(10000) | |
| 59 | - if not chunk: | |
| 60 | - break | |
| 61 | - f.write(chunk) | |
| 51 | + outputdir = tempfile.mkdtemp(prefix='',dir='./submissions/') | |
| 52 | + user_id = outputdir.lstrip('./submissions/') | |
| 53 | + x = web.input(pkgs_file={}) | |
| 54 | + f = open(outputdir + "/packages_list", "wb") | |
| 55 | + #content = x['pkgs_file'].value | |
| 56 | + self.pkgs_list = [] | |
| 57 | + for line in x['pkgs_file'].file: | |
| 58 | + self.pkgs_list.append(line.split()[0]) | |
| 59 | + f.write(line) | |
| 60 | + # while 1: | |
| 61 | + # chunk = x['pkgs_file'].file.read(10000) | |
| 62 | + # if not chunk: | |
| 63 | + # break | |
| 64 | + # f.write(chunk) | |
| 62 | 65 | f.close() |
| 63 | - return render.feedbackForm(action, method, self._recommends(), self._form()) | |
| 64 | 66 | |
| 65 | - def _recommends(self): | |
| 66 | - results = [['Strategy 1', 'gnome-subtitles', 'brasero', 'inkscape', 'kde'], ['Strategy 2', 'airstrike', 'gimp', 'gthumb', 'iceweasel']] | |
| 67 | + strategies = [] | |
| 68 | + if 'strategy_cb' in x: strategies.append("cta") | |
| 69 | + if 'strategy_col' in x: strategies.append("col") | |
| 70 | + if 'strategy_hybrid' in x: strategies.append("hybrid") | |
| 71 | + if 'strategy_hybrid+' in x: strategies.append("hybrid+") | |
| 72 | + | |
| 73 | + return render.feedbackForm(action, method, | |
| 74 | + self._recommends(user_id,strategies), | |
| 75 | + self._form()) | |
| 76 | + | |
| 77 | + def _recommends(self,user_id,strategies): | |
| 78 | + user = User(dict.fromkeys(self.pkgs_list,1),user_id) | |
| 79 | + user.maximal_pkg_profile() | |
| 80 | + cfg = Config() | |
| 81 | + rec = Recommender(cfg) | |
| 82 | + results = dict() | |
| 83 | + for strategy in strategies: | |
| 84 | + eval("rec."+strategy+"(cfg)") | |
| 85 | + prediction = rec.get_recommendation(user).get_prediction() | |
| 86 | + results[rec.strategy.description] = [result[0] for result in prediction] | |
| 87 | + # Colaborative strategies can not go online yet | |
| 88 | + results['Hybrid+'] = [] | |
| 89 | + results['Hybrid'] = [] | |
| 90 | + results['Collaborative'] = [] | |
| 67 | 91 | return results |
| 68 | 92 | |
| 69 | 93 | def _form(self): |
| 70 | 94 | send_form = form.Form( |
| 71 | - form.Radio('Strategy 1',[('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 72 | - form.Radio('Strategy 2',[('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 73 | - form.Radio('Strategy 3',[('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 74 | - form.Radio('Strategy 4',[('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 75 | - form.Radio('Strategy 5',[('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 76 | - form.Radio('Strategy 6',[('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 77 | - form.Dropdown('level', ["Newbie", "Intermediate", "Advanced", "Guru", "Chuck Norris"], description ='Expertise'), | |
| 78 | - form.Textarea('anything', rows="7", cols="60", description='Anything to share?'), | |
| 95 | + form.Radio('Content-based', | |
| 96 | + [('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 97 | + form.Radio('Collaborative', | |
| 98 | + [('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 99 | + form.Radio('Hybrid', | |
| 100 | + [('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 101 | + form.Radio('Hybrid+', | |
| 102 | + [('1','1 '),('2','2 '),('3','3 '),('4','4 '),('5','5')]), | |
| 103 | + form.Dropdown('expertise', | |
| 104 | + ["Newbie", "Intermediate", "Advanced", "Guru", "Chuck Norris"], | |
| 105 | + description ='Debian expertise'), | |
| 106 | + form.Textarea('comments', rows="7", cols="60", | |
| 107 | + description="Anything else to share?"), | |
| 79 | 108 | |
| 80 | 109 | ) |
| 81 | 110 | return send_form |
| ... | ... | @@ -83,3 +112,18 @@ class FeedbackForm: |
| 83 | 112 | class FeedbackThanks: |
| 84 | 113 | def POST(self): |
| 85 | 114 | return render.feedbackThanks() |
| 115 | + | |
| 116 | +render = web.template.render('templates/', base='layout') | |
| 117 | + | |
| 118 | +urls = ('/', 'Index', | |
| 119 | + '/feedback', 'FeedbackForm', | |
| 120 | + '/thanks', 'FeedbackThanks' | |
| 121 | + ) | |
| 122 | + | |
| 123 | +web.webapi.internalerror = web.debugerror | |
| 124 | + | |
| 125 | +if __name__ == "__main__": | |
| 126 | + app = web.application(urls, globals()) | |
| 127 | + app.add_processor(add_global_hook()) | |
| 128 | + app.run() | |
| 129 | + | ... | ... |
src/web/templates/feedbackForm.html
| ... | ... | @@ -6,31 +6,31 @@ $var mod = 'feedback'; |
| 6 | 6 | |
| 7 | 7 | |
| 8 | 8 | <center> |
| 9 | - <h1>Results</h1> | |
| 9 | + <h1>Recommendations</h1> | |
| 10 | 10 | </center> |
| 11 | 11 | |
| 12 | -<p>Results index:</p> | |
| 12 | +<p>Results per strategy:</p> | |
| 13 | 13 | |
| 14 | 14 | <ul class="toc"> |
| 15 | -$for list in recommends: | |
| 16 | - <li><a href="#$list[0]">$list[0]</a></li> | |
| 15 | +$for strategy, result in recommends.items(): | |
| 16 | + <li><a href="#$strategy">$strategy</a></li> | |
| 17 | 17 | <li><a href="#feedback">Your feedback is appreciated!</a></li> |
| 18 | 18 | </ul> |
| 19 | 19 | |
| 20 | 20 | <form action="$action" method="$method"> |
| 21 | -$for list in recommends: | |
| 22 | - <h2><a name="$list[0]" id="$list[0]">$list[0]</a></h2> | |
| 23 | - $for p in list[1:]: | |
| 21 | +$for strategy, result in recommends.items(): | |
| 22 | + <h2><a name="$strategy" id="$strategy">$strategy</a></h2> | |
| 23 | + $for pkg in result: | |
| 24 | 24 | <div class="line"> |
| 25 | 25 | <div class="item col50"> |
| 26 | - <image src="http://screenshots.debian.net/screenshot/$p" width="300"> | |
| 26 | + <image src="http://screenshots.debian.net/screenshot/$pkg" width="300"> | |
| 27 | 27 | </div> |
| 28 | 28 | <div class="item col50 lastcol"> |
| 29 | - <script>loadPackage("$p");</script> | |
| 30 | - <b id="pack-$p"></b><div id="desc-$p"> </div> | |
| 29 | + <script>loadPackage("$pkg");</script> | |
| 30 | + <b id="pack-$pkg"></b><div id="desc-$pkg"> </div> | |
| 31 | 31 | <ul> |
| 32 | - <li id="maint-$p"></li> | |
| 33 | - <li id="homepage-$p"></li> | |
| 32 | + <li id="maint-$pkg"></li> | |
| 33 | + <li id="homepage-$pkg"></li> | |
| 34 | 34 | </ul> |
| 35 | 35 | </div> |
| 36 | 36 | <div class="clear"></div> | ... | ... |