# ##############################################################################
# models.py
# ##############################################################################

import os
from django.db import models

class SmartFolderFileField(models.FileField):
    def get_fixed_folder_path(self, instance, filename):
        folder = "_".join([
            instance._meta.app_label,
            instance._meta.object_name,
            self.name])
        return os.path.join(folder, filename)

    def __init__(self, *args, **kwargs):
        assert not "upload_to" in kwargs
        kwargs["upload_to"] = self.get_fixed_folder_path
        super(SmartFolderFileField, self).__init__(*args, **kwargs)

# ##############################################################################
# tests.py
# ##############################################################################

from django.test import TestCase
from models import *

class TestSmartFolderFileField(TestCase):

    def test_directory_name(self):
        class DummyModel(models.Model):
            fixed = SmartFolderFileField()

        dm = DummyModel()
        self.assertEquals(
            dm.fixed.field.upload_to(dm, 'file_name'),
            os.path.join('utilities_app_DummyModel_fixed', 'file_name'))