Update badge rendering to reflect actual render
* Switch to showing the PNG version by default, as this reflects what will actually be rendered and sent to the printer * Include the greyscale filter * Include the twemoji font we'll use for rendering the badges
This commit is contained in:
		
							parent
							
								
									653cd80891
								
							
						
					
					
						commit
						39669055ef
					
				
					 3 changed files with 32 additions and 12 deletions
				
			
		|  | @ -12,6 +12,9 @@ | ||||||
| --> | --> | ||||||
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||||||
| <svg width="100%" height="100%" viewBox="0 0 1749 1241" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-miterlimit:10;"> | <svg width="100%" height="100%" viewBox="0 0 1749 1241" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-miterlimit:10;"> | ||||||
|  |   <filter id="grayscale"> | ||||||
|  |     <feColorMatrix type="saturate" values="0"/> | ||||||
|  |   </filter> | ||||||
|     <g transform="matrix(1.15527,0,0,1.15527,-22.9233,770.581)"> |     <g transform="matrix(1.15527,0,0,1.15527,-22.9233,770.581)"> | ||||||
|         <g transform="matrix(1,0,0,1,358.181,164.105)"> |         <g transform="matrix(1,0,0,1,358.181,164.105)"> | ||||||
|             <path d="M0,24.414L0,18.184L3.151,15.141C6.52,11.845 8.44,10.323 8.44,8.44C8.44,7.136 7.824,6.991 5.615,6.991C3.296,6.991 0.435,7.534 0.435,7.534L0.072,1.34C0.072,1.34 3.84,0 7.933,0C13.366,0 16.735,2.463 16.735,7.244C16.735,11.41 15.54,13.438 11.591,16.191L9.164,17.894L16.59,17.894L16.59,24.414L0,24.414Z" style="fill:rgb(78,135,160);fill-rule:nonzero;"/> |             <path d="M0,24.414L0,18.184L3.151,15.141C6.52,11.845 8.44,10.323 8.44,8.44C8.44,7.136 7.824,6.991 5.615,6.991C3.296,6.991 0.435,7.534 0.435,7.534L0.072,1.34C0.072,1.34 3.84,0 7.933,0C13.366,0 16.735,2.463 16.735,7.244C16.735,11.41 15.54,13.438 11.591,16.191L9.164,17.894L16.59,17.894L16.59,24.414L0,24.414Z" style="fill:rgb(78,135,160);fill-rule:nonzero;"/> | ||||||
|  | @ -1020,16 +1023,16 @@ | ||||||
|     </g> |     </g> | ||||||
|     <g transform="matrix(0.876643,0,0,0.876643,62.2881,185.276)"> |     <g transform="matrix(0.876643,0,0,0.876643,62.2881,185.276)"> | ||||||
|         <g transform="matrix(0.607846,0,0,0.607922,138.923,372.07)"> |         <g transform="matrix(0.607846,0,0,0.607922,138.923,372.07)"> | ||||||
|             <text x="0px" y="0px" style="font-family:'Roboto-Regular', 'Roboto';font-size:144.577px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.name }}</text> |             <text x="0px" y="0px" filter="url(#grayscale)" style="font-family:'Roboto-Regular', 'Roboto', 'Twitter Color Emoji';font-size:144.577px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.name }}</text> | ||||||
|         </g> |         </g> | ||||||
|         <g transform="matrix(0.607846,0,0,0.607922,138.923,449.05)"> |         <g transform="matrix(0.607846,0,0,0.607922,138.923,449.05)"> | ||||||
|             <text x="0px" y="0px" style="font-family:'Roboto-Regular', 'Roboto';font-size:96.385px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.company }}</text> |             <text x="0px" y="0px" filter="url(#grayscale)" style="font-family:'Roboto-Regular', 'Roboto', 'Twitter Color Emoji';font-size:96.385px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.company }}</text> | ||||||
|         </g> |         </g> | ||||||
|         <g transform="matrix(0.607846,0,0,0.607922,140.5,504.582)"> |         <g transform="matrix(0.607846,0,0,0.607922,140.5,504.582)"> | ||||||
|             <text x="0px" y="0px" style="font-family:'Roboto-Regular', 'Roboto';font-size:60.24px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.free_text_1 }}</text> |             <text x="0px" y="0px" filter="url(#grayscale)" style="font-family:'Roboto-Regular', 'Roboto', 'Twitter Color Emoji';font-size:60.24px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.free_text_1 }}</text> | ||||||
|         </g> |         </g> | ||||||
|         <g transform="matrix(0.607846,0,0,0.607922,140.5,550.359)"> |         <g transform="matrix(0.607846,0,0,0.607922,140.5,550.359)"> | ||||||
|             <text x="0px" y="0px" style="font-family:'Roboto-Regular', 'Roboto';font-size:60.24px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.free_text_2 }}</text> |             <text x="0px" y="0px" filter="url(#grayscale)" style="font-family:'Roboto-Regular', 'Roboto', 'Twitter Color Emoji';font-size:60.24px;">{{ user.attendee.attendeeprofilebase.attendeeprofile.free_text_2 }}</text> | ||||||
|         </g> |         </g> | ||||||
|         <g transform="matrix(0.999321,0,0,0.999446,0,-507.874)"> |         <g transform="matrix(0.999321,0,0,0.999446,0,-507.874)"> | ||||||
|             <g id="text23417" transform="matrix(1,0,0,1,353.552,780.612)"> |             <g id="text23417" transform="matrix(1,0,0,1,353.552,780.612)"> | ||||||
|  |  | ||||||
| Before Width: | Height: | Size: 403 KiB After Width: | Height: | Size: 403 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/src/fonts/TwitterColorEmoji-SVGinOT.ttf
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								static/src/fonts/TwitterColorEmoji-SVGinOT.ttf
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										33
									
								
								vendor/registrasion/registrasion/views.py
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/registrasion/registrasion/views.py
									
										
									
									
										vendored
									
									
								
							|  | @ -2,6 +2,7 @@ import datetime | ||||||
| import zipfile | import zipfile | ||||||
| import os | import os | ||||||
| import logging | import logging | ||||||
|  | import subprocess | ||||||
| 
 | 
 | ||||||
| from django.contrib import messages | from django.contrib import messages | ||||||
| 
 | 
 | ||||||
|  | @ -38,7 +39,6 @@ from django.template import Context, Template, loader | ||||||
| 
 | 
 | ||||||
| from lxml import etree | from lxml import etree | ||||||
| from copy import deepcopy | from copy import deepcopy | ||||||
| from cairosvg import svg2pdf, svg2png |  | ||||||
| 
 | 
 | ||||||
| from registrasion.forms import BadgeForm, ticket_selection | from registrasion.forms import BadgeForm, ticket_selection | ||||||
| from registrasion.contrib.badger import ( | from registrasion.contrib.badger import ( | ||||||
|  | @ -57,7 +57,6 @@ _GuidedRegistrationSection = namedtuple( | ||||||
|     ) |     ) | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| @util.all_arguments_optional | @util.all_arguments_optional | ||||||
| class GuidedRegistrationSection(_GuidedRegistrationSection): | class GuidedRegistrationSection(_GuidedRegistrationSection): | ||||||
|     ''' Represents a section of a guided registration page. |     ''' Represents a section of a guided registration page. | ||||||
|  | @ -1115,26 +1114,44 @@ def _get_badge_template_name(): | ||||||
|     return os.path.join(settings.PROJECT_ROOT, 'pinaxcon', 'templates', |     return os.path.join(settings.PROJECT_ROOT, 'pinaxcon', 'templates', | ||||||
|                         settings.BADGER_DEFAULT_SVG) |                         settings.BADGER_DEFAULT_SVG) | ||||||
| @login_required | @login_required | ||||||
| def user_badge(request, format="svg"): | def user_badge(request, format="png"): | ||||||
|     '''Shows the logged-in user their badge''' |     '''Shows the logged-in user their badge''' | ||||||
| 
 | 
 | ||||||
|     return render_badge(request.user, format) |     return render_badge(request.user, format) | ||||||
| 
 | 
 | ||||||
| @user_passes_test(_staff_only) | @user_passes_test(_staff_only) | ||||||
| def badge(request, user_id, format="svg"): | def badge(request, user_id, format="png"): | ||||||
|     ''' Renders a single user's badge (SVG). ''' |     ''' Renders a single user's badge (PNG). ''' | ||||||
| 
 | 
 | ||||||
|     user_id = int(user_id) |     user_id = int(user_id) | ||||||
|     user = User.objects.get(pk=user_id) |     user = User.objects.get(pk=user_id) | ||||||
| 
 | 
 | ||||||
|     return render_badge(user, format) |     return render_badge(user, format) | ||||||
| 
 | 
 | ||||||
| def render_badge(user, format="svg"): | def _convert_img(img, outformat="png",dpi=200,width=None): | ||||||
|  |     if hasattr(img, "encode"): #a string, or a SafeText | ||||||
|  |         img=img.encode() | ||||||
|  |     width = width or dpi*5.83 #5.83 inches in A6 portrait | ||||||
|  |     conversion_cmdline = [ | ||||||
|  |         "convert", | ||||||
|  |         "-density",str(dpi), | ||||||
|  |         "-resize",str(width), | ||||||
|  |         ] | ||||||
|  |     if outformat=="png": | ||||||
|  |         conversion_cmdline.extend(["-background","white", | ||||||
|  |                                    "-flatten"]) | ||||||
|  |     conversion_cmdline.extend(["-", "{}:-".format(outformat)]) | ||||||
|  |     out = subprocess.run(conversion_cmdline, | ||||||
|  |                          input=img, | ||||||
|  |                          stdout=subprocess.PIPE).stdout | ||||||
|  |     return out | ||||||
|  | 
 | ||||||
|  | def render_badge(user, format="png"): | ||||||
|     rendered = render_badge_svg(user) |     rendered = render_badge_svg(user) | ||||||
|     if format == "png": |     if format == "png": | ||||||
|         rendered = svg2png(bytestring=rendered, dpi=72, scale=3) |         rendered = _convert_img(rendered, outformat="png") | ||||||
|     elif format == "pdf": |     elif format == "pdf": | ||||||
|         rendered = svg2pdf(bytestring=rendered, dpi=72, scale=3) |         rendered = _convert_img(rendered, outformat="pdf") | ||||||
| 
 | 
 | ||||||
|     response = HttpResponse(rendered) |     response = HttpResponse(rendered) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 James Polley
						James Polley