позволяет пользователю подать один голос анонимно с GAE - PullRequest
2 голосов
/ 13 марта 2011

У меня есть приложение GAE для голосования, где каждому избирателю отправляется уникальный ключ по электронной почте, а затем он используется для голосования на веб-странице. Я хотел бы обеспечить, чтобы каждый избиратель мог отдать только один голос, а также чтобы голос оставался анонимным.

У меня есть класс Voter с атрибутом has_voted и класс Vote с атрибутом для голосования. Я хочу, чтобы голоса были анонимными, поэтому я не хочу, чтобы одно было родителем другого.

Я попытался обновить оба с использованием транзакции, например,

def put_vote_transaction(vkey, vote):
    voter = Voter.get(vkey)
    if voter.has_voted:
        return False
    else:
        voter.has_voted = True
        db.put([voter, vote])
        return True

но это не работает, потому что избиратель и голос находятся в разных группах лиц.

Как я могу гарантировать, что каждый избиратель может отдать только один голос, но оставить этот голос анонимным?

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Вы можете назначить элемент голосования избирателю, когда он будет создан для него, чтобы впоследствии «тратить» на его голосование. И вы могли бы использовать одно свойство, чтобы связать голоса-> избирателей и голосов-> thingToVoteOn (полиморфный), чтобы обойти проблемы транзакции. Я постараюсь проиллюстрировать:

Если ваша модель голосования была такой:

Vote(db.Model):
    assigned_to = db.ReferenceProperty(collection_name='votes')

И при условии, что у вас есть другая модель для предмета, по которому вы голосуете, например:

ThingToVoteOn(db.Model):
    pass

И если вы впервые создаете Избирателя, вы назначаете ему Голос

Voter(db.Model):
    # your voter properties

voter = Voter()
voter.put()
vote_to_spend = Vote()
vote_to_spend.assigned_to = voter()
vote_to_spend.put()

Затем позже избиратель может «потратить» этот голос, переназначив его лицу, за которое он голосует:

vote = voter.vote
vote.assigned_to = thing_you_vote_on
vote.put()

Как только голос «отдан», он больше не будет назначен избирателю (поэтому он полностью анонимный), и он всегда происходит в рамках одной и той же транзакции, поскольку он представляет собой только одну сущность (Vote). хранится во время голосования.

1 голос
/ 13 марта 2011

Как вы заметили, поскольку voter и vote находятся в отдельных группах сущностей, вы не можете обновить их в одной транзакции.Однако вы можете обновить voter в транзакции (как сейчас) и записать их vote в транзакционную задачу , связанную с этой транзакцией.

...