Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
  • 1 commit
  • 14 files changed
  • 0 comments
  • 1 contributor
57  addfriend.py
... ...
@@ -0,0 +1,57 @@
  1
+import os
  2
+import cgi
  3
+import common
  4
+import datetime
  5
+import re
  6
+import models
  7
+import webapp2
  8
+
  9
+from google.appengine.ext import db
  10
+from google.appengine.api import mail
  11
+from google.appengine.api import users
  12
+from google.appengine.ext import webapp
  13
+from google.appengine.ext.webapp import template
  14
+
  15
+FRIEND_NICK_PARAM = "f"
  16
+USER_ID_PARAM = "u"
  17
+ADD_FN = "addFriend"
  18
+
  19
+class AddFriendHandler(webapp2.RequestHandler):        
  20
+    def emailFriend(self, friend):
  21
+        mail.send_mail(sender="saurya@gmail.com",
  22
+                      to=friend.nickname() + " <" + friend.email() + ">",
  23
+                      subject="A friend wants to challenge you to workout!",
  24
+                      body="""
  25
+                      Hey there!
  26
+                      
  27
+                      Head on over to http://omarvssaurya.appspot.com and track your workouts!
  28
+                      One of your friends, who has already been using it, wants to challenge you.
  29
+                      
  30
+                      The way it works: you can track your own workouts. Add friends, to see how 
  31
+                      they're doing and compete with them!
  32
+                      
  33
+                      Cheers,
  34
+                      The Workout Challenge Team
  35
+                      """)
  36
+
  37
+    def get(self):
  38
+        user_id = self.request.get(USER_ID_PARAM)
  39
+        parent_key = db.Key.from_path("User", user_id)
  40
+        contest = models.Contest().all().ancestor(parent_key).get()
  41
+        friend = users.User(self.request.get(FRIEND_NICK_PARAM))
  42
+        if contest and friend not in contest.participants:
  43
+            contest.participants.append(friend)
  44
+            contest.put()
  45
+        friend_contest = models.Contest().all().filter('user =', friend).get()
  46
+        if not friend_contest:
  47
+            self.emailFriend(friend)
  48
+        else:
  49
+            friend = friend_contest.user
  50
+            # Render JSONP Response
  51
+            path = os.path.join(os.path.dirname(__file__), 'scorecard.html')
  52
+            self.response.headers['Content-Type'] = 'applicaton/javascript'
  53
+            self.response.out.write(ADD_FN + "('" + common.renderDays(friend, path) + "')")
  54
+
  55
+app = webapp2.WSGIApplication([
  56
+    ('/addfriend', AddFriendHandler)
  57
+], debug=True)
25  app.yaml
... ...
@@ -0,0 +1,25 @@
  1
+application: omarvssaurya
  2
+version: 1
  3
+runtime: python27
  4
+api_version: 1
  5
+threadsafe: yes
  6
+handlers:
  7
+- url: /favicon\.ico
  8
+  static_files: favicon.ico
  9
+  upload: favicon\.ico
  10
+
  11
+- url: /log
  12
+  script: log.app
  13
+- url: /delete
  14
+  script: delete.app
  15
+- url: /addfriend
  16
+  script: addfriend.app
  17
+- url: /deletefriend
  18
+  script: deletefriend.app
  19
+- url: .*
  20
+  script: main.app
  21
+
  22
+
  23
+libraries:
  24
+- name: webapp2
  25
+  version: "2.5.1"
53  common.py
... ...
@@ -0,0 +1,53 @@
  1
+import models
  2
+import os
  3
+import datetime
  4
+from google.appengine.ext import db
  5
+from google.appengine.ext.webapp import template
  6
+
  7
+class Record(list):
  8
+    pass
  9
+
  10
+# returns a tuple of (score, entries_by_date)
  11
+def getDays(user):
  12
+    your_score = 0
  13
+    index = -1
  14
+    date = []
  15
+    yourdays = Record()
  16
+    # run the query to get all entries for this user
  17
+    parent_key = db.Key.from_path("User", user.user_id())
  18
+    entries = models.Entry().all()
  19
+    entries.ancestor(parent_key)
  20
+    entries.order('-date')
  21
+    your_entries = entries.run()
  22
+    for entry in your_entries:
  23
+        if date != entry.date.date():
  24
+            date = entry.date.date()
  25
+            day = Record()
  26
+            day.date = date
  27
+            yourdays.append(day)
  28
+            index += 1
  29
+        your_score += entry.points
  30
+        yourdays[index].append(entry)
  31
+    yourdays.name = user.nickname().split("@")[0]
  32
+    yourdays.score = your_score
  33
+    yourdays.nickname = user.nickname()
  34
+    return yourdays
  35
+    
  36
+def renderDays(user, path):
  37
+    yourdays = getDays(user)
  38
+    today = Record()
  39
+    today.date = datetime.datetime.now().date()
  40
+    if len(yourdays) == 0 or yourdays[0].date != today.date:
  41
+        yourdays.insert(0, today)
  42
+    template_values = {
  43
+       'yourdays' : yourdays
  44
+    }
  45
+    return template.render(path, template_values)
  46
+    
  47
+def getCompetitors(user):
  48
+    contest = models.Contest.all()
  49
+    contest.filter('user =', user)
  50
+    user_contest = contest.get()
  51
+    if user_contest:
  52
+        return user_contest.participants
  53
+    return []
26  delete.py
... ...
@@ -0,0 +1,26 @@
  1
+import os
  2
+import cgi
  3
+import datetime
  4
+import re
  5
+import models
  6
+import webapp2
  7
+
  8
+from google.appengine.ext import db
  9
+from google.appengine.api import users
  10
+from google.appengine.ext import webapp
  11
+from google.appengine.ext.webapp import template
  12
+
  13
+ENTRY_ID_PARAM = "e"
  14
+USER_ID_PARAM = "u"
  15
+
  16
+class DeleteHandler(webapp2.RequestHandler):
  17
+    def get(self):
  18
+        user_id = self.request.get(USER_ID_PARAM)
  19
+        key = self.request.get(ENTRY_ID_PARAM)
  20
+        entry = models.Entry(key=key)
  21
+        db.delete(entry)
  22
+        
  23
+
  24
+app = webapp2.WSGIApplication([
  25
+    ('/delete', DeleteHandler)
  26
+], debug=True)
28  deletefriend.py
... ...
@@ -0,0 +1,28 @@
  1
+import os
  2
+import cgi
  3
+import datetime
  4
+import re
  5
+import models
  6
+import webapp2
  7
+
  8
+from google.appengine.ext import db
  9
+from google.appengine.api import users
  10
+from google.appengine.ext import webapp
  11
+from google.appengine.ext.webapp import template
  12
+
  13
+FRIEND_NICK_PARAM = "f"
  14
+USER_ID_PARAM = "u"
  15
+
  16
+class DeleteFriendHandler(webapp2.RequestHandler):       
  17
+    def get(self):
  18
+        user_id = self.request.get(USER_ID_PARAM)
  19
+        parent_key = db.Key.from_path("User", user_id)
  20
+        contest = models.Contest().all().ancestor(parent_key).get()           
  21
+        friend = users.User(self.request.get(FRIEND_NICK_PARAM))
  22
+        if contest and friend in contest.participants:
  23
+            contest.participants.remove(friend)
  24
+            contest.put()
  25
+        
  26
+app = webapp2.WSGIApplication([
  27
+    ('/deletefriend', DeleteFriendHandler)
  28
+], debug=True)
BIN  favicon.ico
Binary file not shown
17  index.yaml
... ...
@@ -0,0 +1,17 @@
  1
+indexes:
  2
+
  3
+# AUTOGENERATED
  4
+
  5
+# This index.yaml is automatically updated whenever the dev_appserver
  6
+# detects that a new type of query is run.  If you want to manage the
  7
+# index.yaml file manually, remove the above marker line (the line
  8
+# saying "# AUTOGENERATED").  If you want to manage some indexes
  9
+# manually, move them above the marker line.  The index.yaml file is
  10
+# automatically uploaded to the admin console when you next deploy
  11
+# your application using appcfg.py.
  12
+
  13
+- kind: Entry
  14
+  ancestor: yes
  15
+  properties:
  16
+  - name: date
  17
+    direction: desc
51  log.py
... ...
@@ -0,0 +1,51 @@
  1
+import os
  2
+import cgi
  3
+import datetime
  4
+import re
  5
+import models
  6
+import webapp2
  7
+
  8
+from google.appengine.ext import db
  9
+from google.appengine.api import users
  10
+from google.appengine.ext import webapp
  11
+from google.appengine.ext.webapp import template
  12
+
  13
+QUERY_CGI_PARAM = "q"
  14
+USER_ID_PARAM = "u"
  15
+ADD_FN = "addNewEntry"
  16
+
  17
+class LogHandler(webapp2.RequestHandler):
  18
+    def getExerciseName(self, query):
  19
+        words = [s for s in query.split() if not s.isdigit()]
  20
+        return words[0]
  21
+        
  22
+    def getExercise(self, query):
  23
+        return models.exercises[self.getExerciseName(query)]
  24
+        
  25
+    def getNumber(self, query):
  26
+        numbers = [int(s) for s in query.split() if s.isdigit()]
  27
+        return numbers[0]    
  28
+        
  29
+    def get(self):
  30
+        user_id = self.request.get(USER_ID_PARAM)
  31
+        parent_key = db.Key.from_path("User", user_id)
  32
+        contest = models.Contest.all().ancestor(parent_key).get()
  33
+        nickname = contest.user.nickname()
  34
+        entry = models.Entry(parent=parent_key)
  35
+        query = self.request.get(QUERY_CGI_PARAM)
  36
+        exercise = self.getExercise(query)
  37
+        entry.date = datetime.datetime.now()
  38
+        entry.reps = self.getNumber(query)
  39
+        entry.points = exercise[2] * entry.reps
  40
+        entry.name = exercise[0]
  41
+        entry.put()
  42
+        
  43
+        if user_id:
  44
+            # Render JSONP Response
  45
+            self.response.headers['Content-Type'] = 'applicaton/javascript'
  46
+            self.response.out.write(ADD_FN + '(' + str(entry.points) + ',"' + entry.name + '", "' + nickname + '", "' + str(entry.key()) + '")')
  47
+
  48
+
  49
+app = webapp2.WSGIApplication([
  50
+    ('/log', LogHandler)
  51
+], debug=True)
228  log_workout.html
... ...
@@ -0,0 +1,228 @@
  1
+<html>
  2
+<style>
  3
+.scoreboard {
  4
+  display: inline-block;
  5
+  width:40%;
  6
+  height: 40%;
  7
+  overflow-y:auto;
  8
+  overflow-x:hidden;
  9
+  border: 1px solid black;
  10
+  margin: 2px;
  11
+  border-radius: 3px 3px 3px 1px;
  12
+  background: rgba(242, 242, 242, 0.8);
  13
+  position: relative;
  14
+}
  15
+#you {
  16
+  border: 3px solid black;
  17
+  box-shadow: #888 5px 5px 5px;
  18
+}
  19
+.entry {
  20
+   border: 1px solid rgb(100, 100, 242);
  21
+   padding: 6px;
  22
+   min-height: 20px;
  23
+}
  24
+.exercise {
  25
+   display: inline-block;
  26
+   max-width: 30%;
  27
+   font-family: sans-serif;
  28
+}
  29
+.points {
  30
+   display: inline-block;
  31
+   max-width: 30%;
  32
+   left: 40%;
  33
+   position: absolute;
  34
+   font-style: italic;
  35
+   font-weight: bold;
  36
+}
  37
+.score {
  38
+   font-size: 50px;
  39
+   position: absolute;
  40
+   padding: 2px;
  41
+   background: rgba(200, 242, 242, 0.9);
  42
+   right: 0px;
  43
+   z-index: 99;
  44
+   bottom: 0px;
  45
+   border-radius: 5px 0px 0px 0px;
  46
+   cursor: default;
  47
+}
  48
+.name {
  49
+   position: absolute;
  50
+   right: 0px;
  51
+   top: 0px;
  52
+   background: rgba(200, 242, 242, 0.9);
  53
+   border-radius: 0px 3px 0px 0px;
  54
+   padding: 4px;
  55
+   font-size:30px;
  56
+   cursor: default;
  57
+}
  58
+.entry:hover {
  59
+   opacity: 0.3;
  60
+   cursor: pointer;
  61
+}
  62
+.date_separator {
  63
+  border: 1px solid black;
  64
+  height: 3px;
  65
+}
  66
+.date {
  67
+  border: 1px solid black;
  68
+  padding: 3px;
  69
+}
  70
+.delete_friend:hover {
  71
+  background: rgb(250, 50, 50);
  72
+}
  73
+.default_translucent {
  74
+  opacity: 0.6;
  75
+}
  76
+input {
  77
+   margin: 10px;
  78
+   min-width: 10%;
  79
+   max-width: 20%;
  80
+}
  81
+</style>
  82
+
  83
+<!--Slider-->
  84
+
  85
+
  86
+<input type="text" id="tf" class="cleardefault default_translucent" default_value="Enter workout" value="Enter workout"></input>
  87
+<input type="text" id="ff" class="cleardefault default_translucent" default_value="Enter friend's e-mail" value="Enter friend's e-mail"></input>
  88
+<div id="scorecards">
  89
+
  90
+{% for yourdays in users %}
  91
+<div {% if forloop.first %}id="you"{% endif %} class="scoreboard" nickname="{{yourdays.nickname}}">
  92
+  {% for day in yourdays %}
  93
+  <div class="date">{{day.date}}</div>
  94
+  <div class="day">
  95
+    {% for exercise in day %}
  96
+     <div class="entry" {% if forloop.parentloop.first %}entry_id="{{exercise.key}}"{% endif %}>
  97
+       <div class="exercise">
  98
+        {{exercise.name}}
  99
+       </div>
  100
+       <div class="points">
  101
+        +{{exercise.points}}
  102
+       </div>
  103
+     </div>
  104
+   {% endfor %}
  105
+  </div>
  106
+  <div class="date_separator"></div>
  107
+  {% endfor %}
  108
+  <div class="score">{{yourdays.score}}</div>
  109
+  <div class="name {% if not forloop.first %}delete_friend{% endif %}">
  110
+     {{yourdays.name}}
  111
+  </div>
  112
+</div>
  113
+{% endfor %}
  114
+
  115
+</div>
  116
+
  117
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"> </script>
  118
+<script>
  119
+String.prototype.format = function() {
  120
+  var args = arguments;
  121
+  return this.replace(/{(\d+)}/g, function(match, number) {
  122
+    return typeof args[number] != 'undefined'
  123
+      ? args[number]
  124
+      : match
  125
+    ;
  126
+  });
  127
+};
  128
+var entryHtml =  '<div class="entry" entry_id="{2}"> \
  129
+       <div class="exercise"> \
  130
+        {0} \
  131
+       </div> \
  132
+       <div class="points"> \
  133
+        +{1} \
  134
+       </div> \
  135
+     </div>'
  136
+
  137
+var score = {{score}};
  138
+var user_id = "{{user_id}}";
  139
+var parser = new DOMParser();
  140
+var Ids = {
  141
+  SCORE_CARDS : "scorecards",
  142
+  JSONP_REQUEST : "jsonp",
  143
+  TEXT_FIELD : "tf",
  144
+  FRIEND_FIELD: "ff",
  145
+  YOUR_SCORECARD: "you"
  146
+};
  147
+var Classes = {
  148
+  DAYS: "day",
  149
+  ENTRY: "entry",
  150
+  SCORE_CARD: "scoreboard",
  151
+  DELETE_FRIEND: "delete_friend",
  152
+  CLEAR_DEFAULT: "cleardefault",
  153
+  DEFAULT_TRANSLUCENT: "default_translucent"
  154
+};
  155
+$('#' + Ids.TEXT_FIELD).keypress(function(e) {
  156
+  if (e.which == 13) {
  157
+    updateBackend();
  158
+  }
  159
+});
  160
+$('#' + Ids.FRIEND_FIELD).keypress(function(e) {
  161
+  if (e.which == 13) {
  162
+    updateFriends();
  163
+  }
  164
+});
  165
+function makeJsonpRequest(url) {
  166
+  var $script = $('<script>');
  167
+  $script.attr('src', url);
  168
+  $('body').append($script);
  169
+}
  170
+function deleteFromBackend() {
  171
+  var entry_id = $(this).attr('entry_id');
  172
+  makeJsonpRequest('/delete?u=' + user_id + '&e=' + entry_id);
  173
+  var points = $(this).children('.points').html();
  174
+  score -= parseInt(points, 10);
  175
+  var scorecard = $('#' + Ids.YOUR_SCORECARD);
  176
+  scorecard.find('.score').text(score);
  177
+  $(this).remove();
  178
+}
  179
+function deleteFriendFromBackend() {
  180
+  var scorecard = $(this).parents('.' + Classes.SCORE_CARD);
  181
+  var friend_name = scorecard.attr('nickname');
  182
+  makeJsonpRequest('/deletefriend?u=' + user_id + '&f=' + friend_name);
  183
+  scorecard.hide('slow');
  184
+  scorecard.remove();
  185
+}
  186
+function updateFriends() {
  187
+  var text_field = $('#' + Ids.FRIEND_FIELD);
  188
+  var url = '/addfriend?u=' + user_id + '&f=' + text_field.val();
  189
+  text_field.val("");
  190
+  makeJsonpRequest(url);
  191
+}
  192
+function updateBackend() {
  193
+  var text_field = $('#' + Ids.TEXT_FIELD);
  194
+  var url = '/log?u=' + user_id + '&q=' + text_field.val().replace(' ', '+');
  195
+  text_field.val("");
  196
+  makeJsonpRequest(url);
  197
+}
  198
+function addNewEntry(points, name, nickname, entry_id) {
  199
+  var exercise = $('<div>').html(entryHtml.format(name, points, entry_id));
  200
+  score += points;
  201
+  var scorecard = $('[nickname="' + nickname + '"]');
  202
+  var logbook = scorecard.find('.' + Classes.DAYS + ":first");
  203
+  logbook.prepend(exercise);
  204
+  exercise.find('.' + Classes.ENTRY).click(deleteFromBackend);
  205
+  scorecard.find('.score').text(score);
  206
+}
  207
+function addFriend(htmlString) {
  208
+  var scorecard = $(htmlString);
  209
+  $('#' + Ids.SCORE_CARDS).append(scorecard);
  210
+}
  211
+function clearDefault() {
  212
+  var defaultValue = $(this).attr('default_value');
  213
+  if ($(this).val() == defaultValue) {
  214
+    $(this).val("");
  215
+  }
  216
+  $(this).removeClass(Classes.DEFAULT_TRANSLUCENT);
  217
+  $(this).focusout(makeDefault);
  218
+}
  219
+function makeDefault() {
  220
+  var defaultValue = $(this).attr('default_value');
  221
+  $(this).val(defaultValue);
  222
+  $(this).addClass(Classes.DEFAULT_TRANSLUCENT);
  223
+}
  224
+$('#' + Ids.YOUR_SCORECARD).find('.' + Classes.ENTRY).click(deleteFromBackend);
  225
+$('.' + Classes.DELETE_FRIEND).click(deleteFriendFromBackend);
  226
+$('.' + Classes.CLEAR_DEFAULT).focus(clearDefault);
  227
+</script>
  228
+</html>
0  main.app
No changes.
60  main.py
... ...
@@ -0,0 +1,60 @@
  1
+#!/usr/bin/env python
  2
+#
  3
+# Copyright 2007 Google Inc.
  4
+#
  5
+# Licensed under the Apache License, Version 2.0 (the "License");
  6
+# you may not use this file except in compliance with the License.
  7
+# You may obtain a copy of the License at
  8
+#
  9
+#     http://www.apache.org/licenses/LICENSE-2.0
  10
+#
  11
+# Unless required by applicable law or agreed to in writing, software
  12
+# distributed under the License is distributed on an "AS IS" BASIS,
  13
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14
+# See the License for the specific language governing permissions and
  15
+# limitations under the License.
  16
+#
  17
+import webapp2
  18
+
  19
+import os
  20
+import datetime
  21
+import models
  22
+import common
  23
+from google.appengine.ext import db
  24
+from google.appengine.api import users
  25
+from google.appengine.ext import webapp 
  26
+from google.appengine.ext.webapp import template
  27
+
  28
+class MainHandler(webapp2.RequestHandler):
  29
+    def get(self):
  30
+        current_user = users.get_current_user()
  31
+        if not current_user:
  32
+	    self.redirect(users.create_login_url(self.request.uri))
  33
+	    return
  34
+	contest = models.Contest.all().filter('user =', current_user).get()
  35
+	if not contest:
  36
+	    contest = models.Contest(parent=db.Key.from_path("User", current_user.user_id()),user=current_user)
  37
+	    contest.put()
  38
+        competitors = common.getCompetitors(current_user)
  39
+        everyone = [common.getDays(competitor) for competitor in competitors]
  40
+        user_entries = common.getDays(current_user)
  41
+        today = common.Record()
  42
+	today.date = datetime.datetime.now().date()
  43
+	if len(user_entries) == 0 or user_entries[0].date != today.date:
  44
+	    user_entries.insert(0, today)
  45
+
  46
+        everyone.insert(0, user_entries)
  47
+        # Fetch records for others
  48
+        # Fetch my record
  49
+        template_values = {
  50
+                       'users' : everyone,
  51
+                       'score' : user_entries.score,
  52
+                       'user_id' : current_user.user_id(),
  53
+                        }
  54
+        path = os.path.join(os.path.dirname(__file__), 'log_workout.html')
  55
+        self.response.out.write(template.render(path, template_values))
  56
+
  57
+
  58
+app = webapp2.WSGIApplication([
  59
+    ('/', MainHandler)
  60
+], debug=True)
21  models.py
... ...
@@ -0,0 +1,21 @@
  1
+from google.appengine.ext import db
  2
+from google.appengine.api import users
  3
+
  4
+exercises = { 'pushups' : ('pushups', 'reps', 10),
  5
+              'pullups' : ('pullups', 'reps', 10),
  6
+              'burpees' : ('burpees', 'reps', 20),
  7
+              'squats' : ('squats', 'reps', 10),
  8
+              'punching' : ('punching', 'minutes', 60),
  9
+              'jumping' : ('jumping', 'minutes', 40),
  10
+              'plank' : ('plank', 'minutes', 60) }
  11
+
  12
+class Entry(db.Model):
  13
+  reps = db.IntegerProperty()
  14
+  points = db.IntegerProperty()
  15
+  date = db.DateTimeProperty()
  16
+  name = db.StringProperty(choices=set(exercises.keys()))
  17
+    
  18
+class Contest(db.Model):
  19
+  participants = db.ListProperty(users.User)
  20
+  user = db.UserProperty()
  21
+
31  newcontest.py
... ...
@@ -0,0 +1,31 @@
  1
+import os
  2
+import cgi
  3
+import datetime
  4
+import re
  5
+import models
  6
+import webapp2
  7
+
  8
+from google.appengine.ext import db
  9
+from google.appengine.api import users
  10
+from google.appengine.ext import webapp 
  11
+from google.appengine.ext.webapp import template
  12
+
  13
+REPS_CGI_PARAM = "r"
  14
+
  15
+class MainHandler(webapp2.RequestHandler):
  16
+    def get(self):
  17
+        entry = models.Entry
  18
+        # entry.time = get the current time
  19
+        entry.reps = self.request.get(REPS_CGI_PARAM)
  20
+        entry.user = users.get_current_user()
  21
+        entry.points = exercise.points_per_unit * entry.reps
  22
+        
  23
+        if entry.user:
  24
+            # Render JSONP Response
  25
+            self.response.headers['Content-Type'] = 'applicaton/javascript'
  26
+            self.response.out.write(ADD_FN + '(' + entry.points + ',' + entry.exercise.name)
  27
+
  28
+
  29
+app = webapp2.WSGIApplication([
  30
+    ('/', MainHandler)
  31
+], debug=True)
22  scorecard.html
... ...
@@ -0,0 +1,22 @@
  1
+<div class="scoreboard" nickname="{{yourdays.nickname}}"> \
  2
+  {% for day in yourdays %} \
  3
+  <div class="date">{{day.date}}</div> \
  4
+  <div class="day"> \
  5
+    {% for exercise in day %} \
  6
+     <div class="entry"> \
  7
+       <div class="exercise"> \
  8
+        {{exercise.name}} \
  9
+       </div> \
  10
+       <div class="points"> \
  11
+        +{{exercise.points}} \
  12
+       </div> \
  13
+     </div> \
  14
+   {% endfor %} \
  15
+  </div> \
  16
+  <div class="date_separator"></div> \
  17
+  {% endfor %} \
  18
+  <div class="score">{{yourdays.score}}</div> \
  19
+  <div class="name delete_friend"> \
  20
+     {{yourdays.name}} \
  21
+  </div> \
  22
+</div>

No commit comments for this range

Something went wrong with that request. Please try again.