In [ ]:
import mongoengine
from mongoengine import *
In [ ]:
connection_info = {
'host': 'localhost',
'port': 32768,
# 'username': user,
# 'password': password,
# 'authentication_source': 'admin',
# 'authentication_mechanism': 'SCRAM-SHA-1',
# 'ssl': use_ssl,
# 'ssl_cert_reqs': ssl.CERT_NONE,
}
mongoengine.register_connection(alias='core', name='mongo_meetup', **connection_info)
In [ ]:
class User(Document):
first_name = StringField(max_length=50)
last_name = StringField(max_length=50)
email = EmailField(required=True, unique=True)
meta = {
'db_alias': 'core',
'collection': 'users',
'indexes': [
{
'fields': ['email'],
'unique': True,
},
]
}
In [ ]:
class IssueType(EmbeddedDocument):
name = StringField(required=True, max_length=50)
class Priority(EmbeddedDocument):
name = StringField(required=True, max_length=50, choices=('Minor','Major','Blocker'))
class Status(EmbeddedDocument):
name = StringField(required=True, max_length=50)
class Comment(EmbeddedDocument):
content = StringField()
# author = ReferenceField(User, reverse_delete_rule=CASCADE)
class Issue(Document):
issue_type = EmbeddedDocumentField(IssueType)
priority = EmbeddedDocumentField(Priority)
status = EmbeddedDocumentField(Status)
reporter = ReferenceField(User, reverse_delete_rule=CASCADE) # CASCADE - delete all issues when a user is deleted
assignee = ReferenceField(User, reverse_delete_rule=CASCADE)
summary = StringField(max_length=500, required=True)
# comments = ListField(ReferenceField(Comment))
tags = ListField(StringField(max_length=30))
meta = {
'db_alias': 'core',
'collection': 'issues',
'allow_inheritance': True,
'index_background': True,
# see: http://docs.mongoengine.org/guide/defining-documents.html?highlight=indexes#indexes
'indexes': [
'summary',
'$summary', # text index
# 'comments.content',
# ('reporter','-assignee'), # multi-column
]
}
# class CallIssue(Issue):
# image_path = StringField()
In [ ]:
cody = User(first_name='Cody', last_name='Fletcher', email='cody@email.com').save()
michael = User(first_name='Michael', last_name='Nguyen', email='michael@email.com').save()
In [ ]:
# Note: NO .save() needed
priority_major = Priority(name='Major')
issue_type_story = IssueType(name='Story')
status_open = Status(name='Open')
In [ ]:
issue = Issue(
priority=priority_major,
issue_type=issue_type_story,
status=status_open,
summary='Test your code',
reporter=michael,
assignee=cody,
).save()
# Save the issue id
issue_id = issue.id
In [ ]:
# Change priority
# This works without raising an exception...
priority_trivial = Priority(name='Trivial')
# ...but this fails validation
issue.priority = priority_trivial
try:
issue.save()
except ValidationError as e:
print(f'Exception caught: {e}')
In [ ]:
issue_fetched = Issue.objects(id=issue_id).first()
if not issue_fetched:
raise Exception(f'No issue with id {issue_id}')
In [ ]:
Issue.drop_collection()
User.drop_collection()
In [ ]: