Adds FB picture sync script and UI fixes
This commit is contained in:
1 parent
9f1911289a
commit
11a18b6aba
6 files changed
+122
-16
No files matched your search
Executable
+45
@@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
"""
|
||||||
|
This script fetches the members of the KAK facebook group, matches names against the local db, and then saves the users facebook-picture in his/her user profile.
|
||||||
|
|
||||||
|
REQ:
|
||||||
|
https://github.com/iplatform/pyFaceGraph
|
||||||
|
INSTALL:
|
||||||
|
$ pip install pyfacegraph
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os,sys,difflib
|
||||||
|
from facegraph import Graph
|
||||||
|
|
||||||
|
ACCESS_TOKEN = ''
|
||||||
|
PATH = '.'
|
||||||
|
KAK_GROUP_ID = '108265352570560'
|
||||||
|
if PATH not in sys.path:
|
||||||
|
sys.path.append(PATH)
|
||||||
|
|
||||||
|
from django.core.management import setup_environ
|
||||||
|
import settings
|
||||||
|
|
||||||
|
setup_environ(settings)
|
||||||
|
|
||||||
|
from main.models import *
|
||||||
|
|
||||||
|
g = Graph(ACCESS_TOKEN)
|
||||||
|
members = g[KAK_GROUP_ID]['members']()
|
||||||
|
group_members = [(member.name,member.id) for member in members.data]
|
||||||
|
names = [] # to fuzzy search for a name
|
||||||
|
name_lookup = {} # to update the matching UserProfile object
|
||||||
|
for u in User.objects.all().order_by('id'):
|
||||||
|
fullname = u.first_name + " " + u.last_name
|
||||||
|
names.append(fullname)
|
||||||
|
name_lookup[fullname] = u.id
|
||||||
|
|
||||||
|
for member in group_members:
|
||||||
|
match = difflib.get_close_matches(member[0], names, 1) # max 1 match
|
||||||
|
if match:
|
||||||
|
u = UserProfile.objects.get(pk=name_lookup[match[0]])
|
||||||
|
u.image = 'https://graph.facebook.com/{0}/picture'.format(member[1])
|
||||||
|
u.save()
|
||||||
|
|
||||||
@@ -10,15 +10,20 @@ body {
|
|||||||
@include inline-block-list;
|
@include inline-block-list;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
padding: 1.5em;
|
padding-right: 10px;
|
||||||
|
padding-top: 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100px;
|
width: 79px;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: #dddddd;
|
background-color: #dddddd;
|
||||||
}
|
}
|
||||||
&.marked {
|
&.marked {
|
||||||
background-color: #dddddd;
|
color: #468847;
|
||||||
|
background-color: #DFF0D8;
|
||||||
|
}
|
||||||
|
.name {
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -30,12 +35,25 @@ body {
|
|||||||
@include inline-block-list;
|
@include inline-block-list;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
padding: 1.5em;
|
padding-top: 10px;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: #dddddd;
|
background-color: #dddddd;
|
||||||
}
|
}
|
||||||
|
&.marked {
|
||||||
|
color: #468847;
|
||||||
|
background-color: #DFF0D8;
|
||||||
|
}
|
||||||
|
.qty {
|
||||||
|
font-size: 1.7em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.name {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4118,15 +4118,20 @@ body #customer ul li {
|
|||||||
*display: inline;
|
*display: inline;
|
||||||
}
|
}
|
||||||
body #customer ul li {
|
body #customer ul li {
|
||||||
padding: 1.5em;
|
padding-right: 10px;
|
||||||
|
padding-top: 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100px;
|
width: 79px;
|
||||||
}
|
}
|
||||||
body #customer ul li:hover {
|
body #customer ul li:hover {
|
||||||
background-color: #dddddd;
|
background-color: #dddddd;
|
||||||
}
|
}
|
||||||
body #customer ul li.marked {
|
body #customer ul li.marked {
|
||||||
background-color: #dddddd;
|
color: #468847;
|
||||||
|
background-color: #DFF0D8;
|
||||||
|
}
|
||||||
|
body #customer ul li .name {
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
body #register #products ul {
|
body #register #products ul {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -4156,12 +4161,25 @@ body #register #products ul li {
|
|||||||
*display: inline;
|
*display: inline;
|
||||||
}
|
}
|
||||||
body #register #products ul li {
|
body #register #products ul li {
|
||||||
padding: 1.5em;
|
padding-top: 10px;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
body #register #products ul li:hover {
|
body #register #products ul li:hover {
|
||||||
background-color: #dddddd;
|
background-color: #dddddd;
|
||||||
}
|
}
|
||||||
|
body #register #products ul li.marked {
|
||||||
|
color: #468847;
|
||||||
|
background-color: #DFF0D8;
|
||||||
|
}
|
||||||
|
body #register #products ul li .qty {
|
||||||
|
font-size: 1.7em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
body #register #products ul li .name {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
body #register #total div {
|
body #register #total div {
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
background-color: #222;
|
background-color: #222;
|
||||||
|
|||||||
+23
-1
@@ -5,6 +5,21 @@ $(document).ready(function() {
|
|||||||
$(this).show();
|
$(this).show();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function enable_all_products() {
|
||||||
|
$("li.product").each(function(i) {
|
||||||
|
$(this).removeClass("marked");
|
||||||
|
$(this).show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function reset_qtys() {
|
||||||
|
$(".qty").each(function(i) {
|
||||||
|
$(this).html('0');
|
||||||
|
});
|
||||||
|
|
||||||
|
$("input[name$=amount]").each(function(i) {
|
||||||
|
$(this).val("0");
|
||||||
|
});
|
||||||
|
}
|
||||||
function filter_customers(typed) {
|
function filter_customers(typed) {
|
||||||
/* FIXME: Does not work well. */
|
/* FIXME: Does not work well. */
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
@@ -42,9 +57,14 @@ $(document).ready(function() {
|
|||||||
});
|
});
|
||||||
/* Product amount controls */
|
/* Product amount controls */
|
||||||
$("li.product").click( function() {
|
$("li.product").click( function() {
|
||||||
var form_field = $(this).children("input[type=text]");
|
/* Mark the product as selected */
|
||||||
|
$(this).addClass("marked");
|
||||||
|
/* Update amounts */
|
||||||
|
var form_field = $(this).children("input[name$=amount]");
|
||||||
|
var display = $(this).children(".qty");
|
||||||
var qty = Number(form_field.val()) + 1;
|
var qty = Number(form_field.val()) + 1;
|
||||||
form_field.val(qty);
|
form_field.val(qty);
|
||||||
|
display.html(qty);
|
||||||
/* Update total*/
|
/* Update total*/
|
||||||
var sale_price_int = Number($(this).children("span.sale_price_int").text());
|
var sale_price_int = Number($(this).children("span.sale_price_int").text());
|
||||||
var cur_total = Number($("span.total_text").text())
|
var cur_total = Number($("span.total_text").text())
|
||||||
@@ -56,6 +76,8 @@ $(document).ready(function() {
|
|||||||
$("#id_customer_typeahead").val("");
|
$("#id_customer_typeahead").val("");
|
||||||
$("span.total_text").html("");
|
$("span.total_text").html("");
|
||||||
enable_all_customers();
|
enable_all_customers();
|
||||||
|
enable_all_products();
|
||||||
|
reset_qtys();
|
||||||
});
|
});
|
||||||
/* Hide alert messages */
|
/* Hide alert messages */
|
||||||
$("a[data-dismiss=alert]").click(function(){
|
$("a[data-dismiss=alert]").click(function(){
|
||||||
|
|||||||
@@ -28,11 +28,12 @@
|
|||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<li class="customer">
|
<li class="customer">
|
||||||
{% if user.get_profile.image %}
|
{% if user.get_profile.image %}
|
||||||
<img class="profile" src="{{ user.get_profile.image.url }}" /><br />
|
<img class="profile" src="{{ user.get_profile.image }}" /><br />
|
||||||
{% else %}
|
{% else %}
|
||||||
<img class="profile" src="{% gravatar_for_user user %}" /><br />
|
<img class="profile" src="{% gravatar_for_user user 50 %}" /><br />
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="name">{{ user.first_name }} {{ user.last_name|slice:":1"}}</span> ({{ user.get_profile.balance }})
|
<span class="name">{{ user.first_name }} {{ user.last_name|slice:":1"}}</span><br />
|
||||||
|
<span class="balance">{{ user.get_profile.balance }}</span>
|
||||||
<span class="id" style="display:none;">{{ user.id }}</span>
|
<span class="id" style="display:none;">{{ user.id }}</span>
|
||||||
</li>
|
</li>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -35,11 +35,12 @@
|
|||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<li class="customer">
|
<li class="customer">
|
||||||
{% if user.get_profile.image %}
|
{% if user.get_profile.image %}
|
||||||
<img class="profile" src="{{ user.get_profile.image.url }}" /><br />
|
<img class="profile" src="{{ user.get_profile.image }}" /><br />
|
||||||
{% else %}
|
{% else %}
|
||||||
<img class="profile" src="{% gravatar_for_user user %}" /><br />
|
<img class="profile" src="{% gravatar_for_user user 50 %}" /><br />
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="name">{{ user.first_name }} {{ user.last_name|slice:":1"}}</span> ({{ user.get_profile.balance }})
|
<span class="name">{{ user.first_name }} {{ user.last_name|slice:":1"}}</span><br />
|
||||||
|
<span class="balance">{{ user.get_profile.balance }}</span>
|
||||||
<span class="id" style="display:none;">{{ user.id }}</span>
|
<span class="id" style="display:none;">{{ user.id }}</span>
|
||||||
</li>
|
</li>
|
||||||
</li>
|
</li>
|
||||||
@@ -60,8 +61,9 @@
|
|||||||
<ul class="well">
|
<ul class="well">
|
||||||
{% for product in products %}
|
{% for product in products %}
|
||||||
<li id="form-{{forloop.counter0}}" class="product"><input type="hidden" name="form-{{ forloop.counter0 }}-product" value="{{product.id }}" />
|
<li id="form-{{forloop.counter0}}" class="product"><input type="hidden" name="form-{{ forloop.counter0 }}-product" value="{{product.id }}" />
|
||||||
<input type="text" id="form-{{ forloop.counter0 }}-amount" name="form-{{ forloop.counter0 }}-amount" value="0" class="span2" size="2" />
|
<input type="hidden" id="form-{{ forloop.counter0 }}-amount" name="form-{{ forloop.counter0 }}-amount" value="0" class="span2" size="2" />
|
||||||
<input type="hidden" name="form-{{ forloop.counter0 }}-unit_price" value="{{product.sale_price_int }}" />
|
<input type="hidden" name="form-{{ forloop.counter0 }}-unit_price" value="{{product.sale_price_int }}" />
|
||||||
|
<span class="qty">0</span>
|
||||||
{% if product.image %}
|
{% if product.image %}
|
||||||
<img class="product" src="{{ product.image.url }}" /><br />
|
<img class="product" src="{{ product.image.url }}" /><br />
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
Reference in new issue
Block a user