Skip to content

Instantly share code, notes, and snippets.

View dgouldin's full-sized avatar

David Gouldin dgouldin

  • Clara Labs
  • San Francisco, CA
View GitHub Profile
@dgouldin
dgouldin / gist:1811235
Created February 12, 2012 22:31
dedupe a jspf playlist
import json
f = open('playlist.json', 'r')
playlist = json.loads(f.read())
f.close()
tracks = []
track_ids = []
for track in playlist['playlist']['track']:
track_id = track['identifier'][0]
if track_id not in track_ids:
tracks.append(track)
@dgouldin
dgouldin / gist:1805642
Created February 12, 2012 01:30
rdio playlists jspf
[
{
"playlist": {
"creator": "David Gouldin",
"track": [
{
"info": "http://www.rdio.com/artist/Rick_Astley/album/The_Greatest_Hits/",
"album": "The Greatest Hits",
"location": [
"http://rd.io/e/QVGOBDdzOP0"
@dgouldin
dgouldin / file1.txt
Created February 11, 2012 23:16
the description for this gist
String file contents
@dgouldin
dgouldin / composite_bitfield.py
Created December 22, 2011 01:13
Composite BitField
from django.db.models import signals
class CompositeBitField(object):
def __init__(self, fields):
self.fields = fields
def contribute_to_class(self, cls, name):
self.name = name
self.model = cls
cls._meta.add_virtual_field(self)
@dgouldin
dgouldin / gist:1445242
Created December 7, 2011 23:19
Patination of an interable into a generator of page_size lists.
def paginate_iterable(iterable, page_size):
current_page = []
for item in iterable:
current_page.append(item)
if len(current_page) == page_size:
yield current_page
current_page = []
if len(current_page) > 0:
yield current_page
@dgouldin
dgouldin / gist:1411980
Created November 30, 2011 23:46
Chainable python "wrapper" for ImageMagick via subprocess
from __future__ import division
import os
import subprocess
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
@dgouldin
dgouldin / gist:1411676
Created November 30, 2011 23:04
Abstract model class which validates on save using a default ModelForm
from django.db import models
from django import forms
from django.forms.models import modelform_factory
class ValidatingModel(models.Model):
class Meta:
abstract = True
def __init__(self, *args, **kwargs):
self.model_form_class = modelform_factory(self.__class__)
@dgouldin
dgouldin / gist:1320358
Created October 27, 2011 18:17
Django model relation graph
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.db.models import loading
from django.db.models.fields.related import RelatedField
INDENT = ' '
for app_name in settings.INSTALLED_APPS:
print app_name
app_label = app_name.split(".")[-1]
try:
@dgouldin
dgouldin / rolling_rate_limit.py
Created October 12, 2011 01:09
Rolling window rate limit function decorator
from __future__ import division
import datetime
import hashlib
import inspect
import math
import pytz
import time
import urllib
from common.cache import incr, decr
@dgouldin
dgouldin / incrdecr.py
Created October 10, 2011 21:19
At attempt at an atomic and bounded cache incr/decr function which handles key existence.
from django.core.cache import cache
def _incr_decr(key, incr=True, min=None, max=None, initial=None):
'''Incr/decr function which handles key creation as needed'''
# FIXME: min/max have rampant race conditions which could be fixed using
# memcache's "cas" feature, but current pylibmc + libmemcached causes a
# segfault when used.
initial = initial or min or 0