Change search to POST and add sequence numbers

master
Tanner Collin 4 years ago
parent 4e78087338
commit 8c1f1ab3de
  1. 5
      apiserver/apiserver/api/serializers.py
  2. 17
      apiserver/apiserver/api/views.py
  3. 2
      apiserver/apiserver/urls.py
  4. 2
      webclient/src/Home.js
  5. 10
      webclient/src/Members.js
  6. 2
      webclient/src/Transactions.js

@ -24,9 +24,12 @@ class UserSerializer(serializers.ModelSerializer):
# member viewing member list or other member
class OtherMemberSerializer(serializers.ModelSerializer):
q = serializers.CharField(write_only=True, max_length=64)
seq = serializers.IntegerField(write_only=True, )
class Meta:
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
class MemberSerializer(serializers.ModelSerializer):

@ -13,10 +13,6 @@ class AllowMetadata(permissions.BasePermission):
return request.method in ['OPTIONS', 'HEAD']
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = serializers.UserSerializer
search_strings = {}
def gen_search_strings():
@ -33,17 +29,17 @@ def gen_search_strings():
print('Generated search strings in {} s'.format(time.time() - start))
gen_search_strings()
class SearchViewSet(viewsets.ReadOnlyModelViewSet):
class SearchViewSet(viewsets.ViewSet):
permission_classes = [AllowMetadata | permissions.IsAuthenticated]
serializer_class = serializers.OtherMemberSerializer
def get_queryset(self):
NUM_SEARCH_RESULTS = 10
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']):
search = params['q'].lower()
if len(search):
choices = search_strings.keys()
# get exact starts with matches
@ -68,9 +64,10 @@ class SearchViewSet(viewsets.ReadOnlyModelViewSet):
return queryset
def list(self, request):
# must POST so query string doesn't change so preflight request is cached
def create(self, request):
try:
seq = int(request.query_params.get('seq', 0))
seq = int(request.data.get('seq', 0))
except ValueError:
seq = 0

@ -6,7 +6,7 @@ from rest_framework import routers
from .api import views
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'courses', views.CourseViewSet, basename='course')
router.register(r'sessions', views.SessionViewSet, basename='session')

@ -150,7 +150,7 @@ function MemberInfo(props) {
</Table.Row>
)
:
<p>None</p>
<Table.Row><Table.Cell>None</Table.Cell></Table.Row>
}
</Table.Body>
</Table>

@ -8,11 +8,11 @@ import { NotFound, PleaseLogin } from './Misc.js';
export function Members(props) {
const [members, setMembers] = useState(false);
const [search, setSearch] = useState({t: 0, v: ''});
const [search, setSearch] = useState({seq: 0, q: ''});
const { token } = props;
useEffect(() => {
requester('/search/?seq='+search.t+'&q='+search.v, 'GET', '')
requester('/search/', 'POST', token, search)
.then(res => {
if (!members || res.seq > members.seq) {
setMembers(res);
@ -30,12 +30,12 @@ export function Members(props) {
<Input autoFocus focus icon='search'
placeholder='Search...'
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'
/>
<Header size='medium'>
{search.length ? 'Search Results' : 'Recently Vetted'}
{search.q.length ? 'Search Results' : 'Recently Vetted'}
</Header>
{members ?
@ -58,7 +58,7 @@ export function Members(props) {
</Table.Row>
)
:
<p>No Results</p>
<Table.Row><Table.Cell>No Results</Table.Cell></Table.Row>
}
</Table.Body>
</Table>

@ -36,7 +36,7 @@ export function Transactions(props) {
</Table.Row>
)
:
<p>None</p>
<Table.Row><Table.Cell>None</Table.Cell></Table.Row>
}
</Table.Body>
</Table>

Loading…
Cancel
Save