|  |  |  | @ -3,10 +3,17 @@@@ -3,10 +3,17 @@ | 
			
		
	
		
			
				
					|  |  |  |  | import abc | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from sqlalchemy import func | 
			
		
	
		
			
				
					|  |  |  |  | from sqlalchemy.orm.exc import NoResultFound | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from . import models | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class RepoItemNotFound(StopIteration): | 
			
		
	
		
			
				
					|  |  |  |  |     """ repo error for a not found item """ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     pass | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class AbstractOrderRepository(abc.ABC): | 
			
		
	
		
			
				
					|  |  |  |  |     """ Abstract base class for a datastore """ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -63,9 +70,14 @@ class SqlAlchemyRepository(AbstractOrderRepository):@@ -63,9 +70,14 @@ class SqlAlchemyRepository(AbstractOrderRepository): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def get_order(self, reference): | 
			
		
	
		
			
				
					|  |  |  |  |         """ get an order from the database by primary key """ | 
			
		
	
		
			
				
					|  |  |  |  |         return ( | 
			
		
	
		
			
				
					|  |  |  |  |             self.session.query(models.OrderItem).filter_by(id=reference).one() | 
			
		
	
		
			
				
					|  |  |  |  |         ) | 
			
		
	
		
			
				
					|  |  |  |  |         try: | 
			
		
	
		
			
				
					|  |  |  |  |             return ( | 
			
		
	
		
			
				
					|  |  |  |  |                 self.session.query(models.OrderItem) | 
			
		
	
		
			
				
					|  |  |  |  |                 .filter_by(id=reference) | 
			
		
	
		
			
				
					|  |  |  |  |                 .one() | 
			
		
	
		
			
				
					|  |  |  |  |             ) | 
			
		
	
		
			
				
					|  |  |  |  |         except NoResultFound as exc: | 
			
		
	
		
			
				
					|  |  |  |  |             raise RepoItemNotFound from exc | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def list_orders(self): | 
			
		
	
		
			
				
					|  |  |  |  |         """ list orders orderd by date, descending """ | 
			
		
	
	
		
			
				
					|  |  |  | @ -81,21 +93,34 @@ class SqlAlchemyRepository(AbstractOrderRepository):@@ -81,21 +93,34 @@ class SqlAlchemyRepository(AbstractOrderRepository): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def get_user(self, reference): | 
			
		
	
		
			
				
					|  |  |  |  |         """ get a user from the database by primary key """ | 
			
		
	
		
			
				
					|  |  |  |  |         return self.session.query(models.User).filter_by(id=reference).one() | 
			
		
	
		
			
				
					|  |  |  |  |         try: | 
			
		
	
		
			
				
					|  |  |  |  |             return ( | 
			
		
	
		
			
				
					|  |  |  |  |                 self.session.query(models.User).filter_by(id=reference).one() | 
			
		
	
		
			
				
					|  |  |  |  |             ) | 
			
		
	
		
			
				
					|  |  |  |  |         except NoResultFound as exc: | 
			
		
	
		
			
				
					|  |  |  |  |             raise RepoItemNotFound from exc | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def get_user_by_username(self, reference): | 
			
		
	
		
			
				
					|  |  |  |  |         """ get a user from the database by username """ | 
			
		
	
		
			
				
					|  |  |  |  |         return ( | 
			
		
	
		
			
				
					|  |  |  |  |             self.session.query(models.User).filter_by(username=reference).one() | 
			
		
	
		
			
				
					|  |  |  |  |         ) | 
			
		
	
		
			
				
					|  |  |  |  |         try: | 
			
		
	
		
			
				
					|  |  |  |  |             return ( | 
			
		
	
		
			
				
					|  |  |  |  |                 self.session.query(models.User) | 
			
		
	
		
			
				
					|  |  |  |  |                 .filter_by(username=reference) | 
			
		
	
		
			
				
					|  |  |  |  |                 .one() | 
			
		
	
		
			
				
					|  |  |  |  |             ) | 
			
		
	
		
			
				
					|  |  |  |  |         except NoResultFound as exc: | 
			
		
	
		
			
				
					|  |  |  |  |             raise RepoItemNotFound from exc | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def get_user_by_email(self, reference): | 
			
		
	
		
			
				
					|  |  |  |  |         """ get a user from the database by email """ | 
			
		
	
		
			
				
					|  |  |  |  |         return ( | 
			
		
	
		
			
				
					|  |  |  |  |             self.session.query(models.User) | 
			
		
	
		
			
				
					|  |  |  |  |             .filter(func.lower(models.User.email) == func.lower(reference)) | 
			
		
	
		
			
				
					|  |  |  |  |             .one() | 
			
		
	
		
			
				
					|  |  |  |  |         ) | 
			
		
	
		
			
				
					|  |  |  |  |         try: | 
			
		
	
		
			
				
					|  |  |  |  |             return ( | 
			
		
	
		
			
				
					|  |  |  |  |                 self.session.query(models.User) | 
			
		
	
		
			
				
					|  |  |  |  |                 .filter(func.lower(models.User.email) == func.lower(reference)) | 
			
		
	
		
			
				
					|  |  |  |  |                 .one() | 
			
		
	
		
			
				
					|  |  |  |  |             ) | 
			
		
	
		
			
				
					|  |  |  |  |         except NoResultFound as exc: | 
			
		
	
		
			
				
					|  |  |  |  |             raise RepoItemNotFound from exc | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     def list_users(self): | 
			
		
	
		
			
				
					|  |  |  |  |         """ list users orderd by username """ | 
			
		
	
	
		
			
				
					|  |  |  | 
 |