MongoEngine / flask-mongoengine

MongoEngine flask extension with WTF model forms support
Other
840 stars 256 forks source link

Debugtoolbar misses query and double inheritance=dobule save and object doesn't save #13

Closed ddorian closed 12 years ago

ddorian commented 12 years ago

import flask
import datetime
from flask.ext.mongoengine import MongoEngine
from flask_debugtoolbar import DebugToolbarExtension
from mongoengine import *
from mongoengine.queryset import QuerySet

app = flask.Flask(__name__)
app.config['SECRET_KEY']       = 'not so secret'
app.config['DEBUG_TB_PANELS']  = ('flask.ext.mongoengine.panels.MongoDebugPanel',)
app.debug = True

db = MongoEngine()
db.init_app(app)
DebugToolbarExtension(app)

class AwesomerQuerySet(QuerySet):
    pass
    def filter_project(self, project_id):
        gt = int(str(project_id)+"000000000000")
        lt = int(str(project_id)+"999999999999")
        return self.__call__(pk__gte=int(str(project_id)+"000000000000")).filter(pk__lte=int(str(project_id)+"999999999999"))
    def filter_date(self,project_id,date,gt=False):
        date_int = int(str(project_id)+str(int(time.mktime(date.timetuple()) * 100 + random.randrange(99))))
        return self.__call__(pk__gt=date_int) if gt else self.__call__(pk__lt=date_int)

class PP(db.Document):
    theid= SequenceField(primary_key=True)

class Parent(object):
    updated = DateTimeField(db_field="2")
    created = IntField(primary_key=True)

    meta = {'cascade': False, 'allow_inheritance': False, 'queryset_class': AwesomerQuerySet}

    @classmethod
    def pre_save(cls, sender, document, **kwargs):
        document.gen_pk()
        print "pre_save"

    def gen_pk(self):
        self.created = str(self.project.pk)+str(int(time.mktime(datetime.datetime.utcnow().timetuple()) * 100 + random.randrange(99)))

class One(Parent,db.Document):
    related_videos = ListField(ReferenceField('Video',dbref=False),db_field="r")
    ssss = StringField()
    title = StringField(db_field="t")
    meta = {'cascade': False, 'allow_inheritance': False, 'queryset_class': AwesomerQuerySet}

signals.pre_save.connect(One.pre_save, sender=One)

@app.route('/test/')
def domain_testing():
    pp = PP()
    pp.save()
    one = One(project=pp)
    one.save()

    return render_template("empty.html")

The problems:

Save is triggered twice on the One class. There should be 3 queries in the toolbar: 1.PP created 2.One create 3.One updated. Only 3 is in the toolbar. PP object is not saved in the db. Ignore the queryset.

ddorian commented 12 years ago

Please change the class in related_videos to something else. That listfield is so you can see in the debugtoolbar that the second save is removing the empty list because empty queries are not showed in the debugtoolbar.

anemitz commented 12 years ago

Would you be willing to provide a testcase + pull request?

ddorian commented 12 years ago

i changed my program