Change search to POST and add sequence numbers
This commit is contained in:
		@@ -24,9 +24,12 @@ class UserSerializer(serializers.ModelSerializer):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# member viewing member list or other member
 | 
					# member viewing member list or other member
 | 
				
			||||||
class OtherMemberSerializer(serializers.ModelSerializer):
 | 
					class OtherMemberSerializer(serializers.ModelSerializer):
 | 
				
			||||||
 | 
					    q = serializers.CharField(write_only=True, max_length=64)
 | 
				
			||||||
 | 
					    seq = serializers.IntegerField(write_only=True, )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        model = models.Member
 | 
					        model = models.Member
 | 
				
			||||||
        fields = ['preferred_name', 'last_name', 'status', 'current_start_date']
 | 
					        fields = ['q', 'seq', 'preferred_name', 'last_name', 'status', 'current_start_date']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# member viewing himself
 | 
					# member viewing himself
 | 
				
			||||||
class MemberSerializer(serializers.ModelSerializer):
 | 
					class MemberSerializer(serializers.ModelSerializer):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,10 +13,6 @@ class AllowMetadata(permissions.BasePermission):
 | 
				
			|||||||
        return request.method in ['OPTIONS', 'HEAD']
 | 
					        return request.method in ['OPTIONS', 'HEAD']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UserViewSet(viewsets.ModelViewSet):
 | 
					 | 
				
			||||||
    queryset = User.objects.all().order_by('-date_joined')
 | 
					 | 
				
			||||||
    serializer_class = serializers.UserSerializer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
search_strings = {}
 | 
					search_strings = {}
 | 
				
			||||||
def gen_search_strings():
 | 
					def gen_search_strings():
 | 
				
			||||||
@@ -33,17 +29,17 @@ def gen_search_strings():
 | 
				
			|||||||
    print('Generated search strings in {} s'.format(time.time() - start))
 | 
					    print('Generated search strings in {} s'.format(time.time() - start))
 | 
				
			||||||
gen_search_strings()
 | 
					gen_search_strings()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SearchViewSet(viewsets.ReadOnlyModelViewSet):
 | 
					class SearchViewSet(viewsets.ViewSet):
 | 
				
			||||||
 | 
					    permission_classes = [AllowMetadata | permissions.IsAuthenticated]
 | 
				
			||||||
    serializer_class = serializers.OtherMemberSerializer
 | 
					    serializer_class = serializers.OtherMemberSerializer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_queryset(self):
 | 
					    def get_queryset(self):
 | 
				
			||||||
        NUM_SEARCH_RESULTS = 10
 | 
					        NUM_SEARCH_RESULTS = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        queryset = models.Member.objects.all()
 | 
					        queryset = models.Member.objects.all()
 | 
				
			||||||
        params = self.request.query_params
 | 
					        search = self.request.data.get('q', '').lower()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if 'q' in params and len(params['q']):
 | 
					        if len(search):
 | 
				
			||||||
            search = params['q'].lower()
 | 
					 | 
				
			||||||
            choices = search_strings.keys()
 | 
					            choices = search_strings.keys()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # get exact starts with matches
 | 
					            # get exact starts with matches
 | 
				
			||||||
@@ -68,9 +64,10 @@ class SearchViewSet(viewsets.ReadOnlyModelViewSet):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return queryset
 | 
					        return queryset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def list(self, request):
 | 
					    # must POST so query string doesn't change so preflight request is cached
 | 
				
			||||||
 | 
					    def create(self, request):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            seq = int(request.query_params.get('seq', 0))
 | 
					            seq = int(request.data.get('seq', 0))
 | 
				
			||||||
        except ValueError:
 | 
					        except ValueError:
 | 
				
			||||||
            seq = 0
 | 
					            seq = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@ from rest_framework import routers
 | 
				
			|||||||
from .api import views
 | 
					from .api import views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
router = routers.DefaultRouter()
 | 
					router = routers.DefaultRouter()
 | 
				
			||||||
router.register(r'users', views.UserViewSet)
 | 
					#router.register(r'users', views.UserViewSet)
 | 
				
			||||||
router.register(r'members', views.MemberViewSet, basename='member')
 | 
					router.register(r'members', views.MemberViewSet, basename='member')
 | 
				
			||||||
router.register(r'courses', views.CourseViewSet, basename='course')
 | 
					router.register(r'courses', views.CourseViewSet, basename='course')
 | 
				
			||||||
router.register(r'sessions', views.SessionViewSet, basename='session')
 | 
					router.register(r'sessions', views.SessionViewSet, basename='session')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -150,7 +150,7 @@ function MemberInfo(props) {
 | 
				
			|||||||
							</Table.Row>
 | 
												</Table.Row>
 | 
				
			||||||
						)
 | 
											)
 | 
				
			||||||
					:
 | 
										:
 | 
				
			||||||
						<p>None</p>
 | 
											<Table.Row><Table.Cell>None</Table.Cell></Table.Row>
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				</Table.Body>
 | 
									</Table.Body>
 | 
				
			||||||
			</Table>
 | 
								</Table>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,11 +8,11 @@ import { NotFound, PleaseLogin } from './Misc.js';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export function Members(props) {
 | 
					export function Members(props) {
 | 
				
			||||||
	const [members, setMembers] = useState(false);
 | 
						const [members, setMembers] = useState(false);
 | 
				
			||||||
	const [search, setSearch] = useState({t: 0, v: ''});
 | 
						const [search, setSearch] = useState({seq: 0, q: ''});
 | 
				
			||||||
	const { token } = props;
 | 
						const { token } = props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	useEffect(() => {
 | 
						useEffect(() => {
 | 
				
			||||||
		requester('/search/?seq='+search.t+'&q='+search.v, 'GET', '')
 | 
							requester('/search/', 'POST', token, search)
 | 
				
			||||||
		.then(res => {
 | 
							.then(res => {
 | 
				
			||||||
			if (!members || res.seq > members.seq) {
 | 
								if (!members || res.seq > members.seq) {
 | 
				
			||||||
				setMembers(res);
 | 
									setMembers(res);
 | 
				
			||||||
@@ -30,12 +30,12 @@ export function Members(props) {
 | 
				
			|||||||
			<Input autoFocus focus icon='search'
 | 
								<Input autoFocus focus icon='search'
 | 
				
			||||||
				placeholder='Search...'
 | 
									placeholder='Search...'
 | 
				
			||||||
				value={search.v}
 | 
									value={search.v}
 | 
				
			||||||
				onChange={(e, v) => setSearch({t: e.timeStamp, v: v.value})}
 | 
									onChange={(e, v) => setSearch({seq: e.timeStamp, q: v.value})}
 | 
				
			||||||
				aria-label='search products'
 | 
									aria-label='search products'
 | 
				
			||||||
			/>
 | 
								/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			<Header size='medium'>
 | 
								<Header size='medium'>
 | 
				
			||||||
				{search.length ? 'Search Results' : 'Recently Vetted'}
 | 
									{search.q.length ? 'Search Results' : 'Recently Vetted'}
 | 
				
			||||||
			</Header>
 | 
								</Header>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			{members ?
 | 
								{members ?
 | 
				
			||||||
@@ -58,7 +58,7 @@ export function Members(props) {
 | 
				
			|||||||
								</Table.Row>
 | 
													</Table.Row>
 | 
				
			||||||
							)
 | 
												)
 | 
				
			||||||
						:
 | 
											:
 | 
				
			||||||
							<p>No Results</p>
 | 
												<Table.Row><Table.Cell>No Results</Table.Cell></Table.Row>
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					</Table.Body>
 | 
										</Table.Body>
 | 
				
			||||||
				</Table>
 | 
									</Table>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@ export function Transactions(props) {
 | 
				
			|||||||
							</Table.Row>
 | 
												</Table.Row>
 | 
				
			||||||
						)
 | 
											)
 | 
				
			||||||
					:
 | 
										:
 | 
				
			||||||
						<p>None</p>
 | 
											<Table.Row><Table.Cell>None</Table.Cell></Table.Row>
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				</Table.Body>
 | 
									</Table.Body>
 | 
				
			||||||
			</Table>
 | 
								</Table>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user