After much digging, I was able to find the problem. In fields.py in
django-tagging, the tags are pulled from cache when they are saved,
rather than going back to the database.

The problem I was seeing wasn't that tags werent' being applied to
objects, or added to the database, but the input field was NOT
reflecting the changes to the tags. The cache was not being set with
the new values.

So, I found a ticket on the tagging site:
http://code.google.com/p/django-tagging/issues/detail?id=28&can=1&q=cache

Which has a patch, but that doesn't work for the svn checkout of
django-tagging. I changed the _post_init method to:

#fields.py
def contribute_to_class(self, cls, name):
        super(TagField, self).contribute_to_class(cls, name)

        # Make this object the descriptor for field access.
        setattr(cls, self.name, self)

        # Save tags back to the database post-save
        signals.post_save.connect(self._save, cls, True)
        signals.post_init.connect(self._post_init, cls, True) #wire it
up here

def _post_init(self, **kwargs):
        instance = kwargs['instance']
        if instance._get_pk_val() is None:
            self._set_instance_tag_cache(instance, '')
        else:
            self._set_instance_tag_cache(instance, edit_string_for_tags
(Tag.objects.get_for_object(instance)))
            #this re-sets the tags from the database


This caused some interesting behavior on the form field. Instead of
tags being separated by commas, and multi-word tags being enclosed in
quotes, everything was just separated by a space. This causes tags to
be improperly assigned on the next save. So, I changed the
edit_string_for_tags method to:

def edit_string_for_tags(tags):
    names = []
    for tag in tags:
        name = tag.name
        if u' ' in name:
            names.append('"%s"' % name)
            continue
        names.append(name)

    return ', '.join(names)


Now tags are properly formatted in my tags text field, and tags are
properly assigned to objects. This also does not break compatibility
with other DB types for me. Last step will be to replace my
cx_Oracle-4.4.1 driver with the latest 5.0.1, and see if it still
works.

Hope this helps someone out!

Cheers,
Brandon

On Mar 23, 5:40 pm, Brandon Taylor <btaylordes...@gmail.com> wrote:
> Hi Ian,
>
> I'm not that familiar with Oracle, so I have no idea if the problems
> I'm experiencing are related in some way to permissions, etc, but I
> have been reassured by my Oracle person that my user has full
> permissions on my schema.
>
> That being said, the TagField() will show up in admin when specifying:
>
> from tagging.fields import TagField
>
> class MyModel(models.Model):
>     tags = TagField()
>
> When I create a new record, any tags that I have entered will be saved
> to the tagging tables and associated to the record. However, when I
> update the record, and add tags that aren't already present, or remove
> all of the tags, no changes to the record will occur. All of the tags
> that were there when I created the record are still there, but no new
> tags, and no tags removed.
>
> If I take the *exact* same model code, and switch my database to
> SQLite or MySQL, I have no issues. I can only deduce that it's
> something either wrong with my Oracle permissions, or with cx_Oracle
> itself. I have wiped out my tables, re-validated, re-sync'd. Quadruple-
> checked my code. And still the same problem. But yes, at least I can
> add tags.
>
> Perplexed,
> Brandon
>
> On Mar 23, 4:31 pm, Ian Kelly <ian.g.ke...@gmail.com> wrote:
>
> > On Mar 23, 1:52 pm, Brandon Taylor <btaylordes...@gmail.com> wrote:
>
> > > Hi Everyone,
>
> > > Is anyone having issues with Django Tagging (svn) not updating tags on
> > > an existing model? I'm running cx_Oracle-4.4.1 - thanks to (Ian Kelly)
> > > and Django Trunk.
>
> > Hmm.  I tried running the same model you posted before with Python 2.6
> > and cx_Oracle 5.0.1, and I can't see that it makes any difference; it
> > still works for me.  Glad you got it (at least partially) working,
> > though.
>
> > > I can add tags when a model instance is created, but update/delete is
> > > not working.
>
> > Can you be more specific?  It seems to be working for me.
>
> > Regards,
> > Ian
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to