text:
What Happens to Patients When Thousands of Cardiologists Leave Town?
This week, Bapu Jena presents some hot-off-the-presses research exploring the relationship between how many patients a doctor sees, and how well those patients do. Plus, the surprising impact of annual cardiology conferences that prompted Bapu's first conversation with Stephen Dubner on Freakonomics Radio.
Bapu JENA: Back in 2015, I did a study about what happens to patients when cardiologists flock to their big annual conferences. Because when thousands of healthcare professionals all pile into a convention center, it must have an effect, right? Well, the results surprised me. And it sparked the young Stephen Dubner's interest too. He asked me to come talk about it on Freakonomics Radio. And in a lot of ways, you can draw a line from that first conversation with Stephen to where we are now.
From the Freakonomics Radio Network, welcome to Freakonomics, M.D.
I'm Bapu Jena. I'm an economist but I'm also a medical doctor. In each episode, I dissect a fascinating question at the sweet spot between health and economics. Today: When a lot of cardiologists leave town and head to their big annual conference, what happens to the patients who need care?
JENA: I thought it would be fun to hop in a time machine today and have you listen to that conversation from Freakonomics Radio about the cardiology meetings study. And after that, I want to tell you about some hot-off-the-presses research my colleagues and I just published that was inspired by it. So stick around for that.
But for now, let's go back to 2015, when this conversation aired on Freakonomics Radio. Remember 2015? Thanks to the pandemic, it actually all feels like a long time ago now. Let's see. In 2015, Barack Obama was still president
Barack OBAMA: Welcome to the fourth quarter of my presidency.
and the primaries were in full swing. People watched movies in theaters.
Chris PRATT: You just went and made a new dinosaur? Probably not a good idea.
Jurassic World broke all box office records in its opening weekend.
Bruno Mars' "Uptown Funk" was pretty hard to avoid anytime you found yourself on a packed dance floor at a wedding, which I certainly did. And if you were willing to sell your house, you might have been able to get a ticket to see Hamilton on Broadway.
Alexander HAMILTON: I am not throwing away my shot.
As for me, I had recently become a young dad and my cardiology meetings study had just come out days before my daughter was born. The reason I remember it so clearly was a reporter called me to talk about it when my wife was in labor. And yes, I did make the mistake of stepping out of the room to take that call. Bad move, folks, bad move.
Not too long after that though, Stephen called me up. And he wanted to chat about the study and how it fit into some episodes he was doing on how healthcare is delivered and when it works and doesn't work.
Stephen DUBNER: Our healthcare system generates an enormous amount of data. Innumerable inputs. Innumerable outputs. For us laypeople, that can seem like a nightmare; for an economist, it's a dream. For there's a lot to be learned from a clever and robust analysis of all that data. Consider the data collected through Medicare, the government-run program that provides coverage primarily to Americans 65 and older.
JENA: So, anytime a Medicare beneficiary receives any care, whether they see a doctor in an office, or whether they're hospitalized, a claim is filed to Medicare for billing purposes.
That's Anupam Jena. He's an assistant professor of healthcare policy and medicine at Harvard Medical School. But Jena isn't just an M.D.; he also holds a Ph.D. in economics. That dual training has very much informed the way Jena thinks about his work. When he was doing his residency, for instance, in internal medicine, a question came to mind. How helpful were the medical procedures being carried out by his elders?
JENA: And in some instances, it was pretty clear, at least to the residents in training, that a procedure may not have been appropriate for that patient.
Jena also wondered about the differences between doctors in a given hospital.
JENA: And so that got me thinking, well, what happens to patients when certain doctors aren't around, or when, let's say, doctors go away to conferences? What happens to their patients during those dates?
Yeah, what does happen to patients when doctors go to medical conferences? When the doctor's away, does the patient pay? Let's think about cardiology, heart medicine. Every year, there are two major conferences for cardiologists in the U.S.: the American Heart Association conference, usually held in the fall, and the American College of Cardiology, or A.C.C., conference, typically held early in the year. This year, it was in March, in San Diego, a nice place to be after a long cold winter back east. Out of the 30,000-plus cardiologists in the U.S., more than 7,000 of them are estimated to be at each of these two meetings.
JENA: So it's not a small number of cardiologists that attend. And the purpose is to present new research findings, to hear about old research findings, to recertify, to get more information about what's up to date in the field.
Jena thought he knew what might happen to heart patients during these conferences. There have been a number of studies, he says, about what happens to hospital patients during off-peak hours.
JENA: So, if you're hospitalized after midnight, or if you're hospitalized on the weekend, as a patient, do you have worse outcomes? And the answer in most studies has actually been yes. Not all, but most of these find that patients receive—
Stephen DUBNER: They have worse outcomes, yes?
JENA: Exactly. Worse outcomes if you're hospitalized during off hours. And so that was kind of a natural stepping stone to say, what happens if you're a patient and you happen to be hospitalized with a really acute condition when cardiologists are out of town at a national meeting?
To answer that question, Jena, along with three co-authors – Vinay Prasad, Dana Goldman and John Romley – turned to the Medicare data.
JENA: So, when a Medicare beneficiary dies, that information is also reported back to Medicare. And what that kind of information allows us to do is to say, when are they hospitalized? Meaning what date are they hospitalized? And what happens to you after you leave the hospital? Do you go to a skilled nursing facility? Do you go home? Do you make it past 30 days? Are you dead within 30 days? So all of that information is available for researchers to analyze.
They began to overlay patient data with the dates of the cardiology conferences, covering a 10-year stretch. They looked at patients admitted during those conferences and, for comparison's sake, patients admitted in the three weeks before and after those conferences. They narrowed their analysis to the patients who were in really bad shape.
JENA: The idea is we want to pick conditions where a patient doesn't choose to not come to the hospital because their particular doctor is away or because they have some knowledge that cardiologists are away during this time. And so we wanted to pick three really acute conditions. The first was cardiac arrest. Cardiac arrest is a condition where your heart stops beating completely.
DUBNER: Oops, hang on one second.
Let me just say we were speaking to Jena back in February. I was in New York, and he was in Boston, which had just been hit by yet another monster snowstorm.
DUBNER: Hang on one second. I was hearing some background sound like a truck or something.
JENA: Yeah, that was a snow plow that just went by.
You may hear a few more snow plows before this conversation is over. Okay, back to Dr. Jena and cardiac arrest.
JENA: Cardiac arrest is a condition where your heart stops beating. It's not a condition that someone chooses to have, it just happens to you. By definition, you die. And you're brought back to life. So it is the most acute thing that you can imagine happening to you.
Jena and his colleagues also looked at heart failure.
JENA: And heart failure, as you might know, comes in a number of varieties, but we looked at patients who have really severe heart failure. So, to give you a sense of the numbers involved, about 30 percent of these patients are not alive within 30 days of hospitalization. So it's a pretty acute condition, a high mortality condition. And the last condition that we looked at was heart attack. The medical term is acute myocardial infarction, but it's basically when one or more of the arteries that supply your heart has an acute blockage, and so blood doesn't go to your heart. And again, the same kind of mortality rates. Thirty percent mortality almost at about 30 days.
The Medicare data covered tens of thousands of hospitalizations for these three conditions over the 10 years' worth of annual cardiology meetings.
JENA: It's about as close to a randomized control trial as you could ever hope to get. These patients are nearly identical on meeting and non-meeting days. They're the same age, the same sex, the same race. We look at 10 different chronic conditions that they have. They have identical percentages of each one of them. So they're basically the same.
So, what did Jena and his colleagues find? How did the cardiologists' absence affect patient outcomes?
JENA: We just assumed that the decreased availability of doctors would imply that outcomes would be worse. And that was our initial hypothesis, but what we found was the opposite.
The opposite – meaning that patients were less likely to die while the doctors were away. But only, we should point out, for certain high-risk patients in certain kinds of hospitals. Jena and his colleagues looked at teaching hospitals and non-teaching hospitals. The assumption is that teaching hospitals have more of the type of cardiologists who are likely to attend conferences, but that's only a hunch. And that is where Jena found the surprise in his data. In non-teaching hospitals, the conference didn't seem to matter. But patients who were admitted for cardiac arrest to a teaching hospital during one of the cardiology conferences were roughly 10 percentage points more likely to survive than if they were admitted on non-conference dates. Patients with heart failure — again, at teaching hospitals — were 8 percentage points more likely to survive during a cardiology conference.
JENA: High-risk heart failure. What we found is that if you're hospitalized on a cardiology meeting date, your mortality is about 17 percent at 30 days, 17-18 percent. Whereas if you're hospitalized just a few days before or a few days after, your mortality is closer to 25 percent. So that's a very large difference.
DUBNER: Wow. It just sounds so absurd. I mean, I've read the paper; I know what you're going to say, but it still sounds so absurd. So, basically, if I have a major heart condition and someone gets me to a good teaching hospital— I live in New York. My hospital is Columbia Presbyterian. That's a great teaching hospital. You're saying that I have a better chance of surviving if there's a cardiology conference going on and some of the top cardiologists are not there?
JENA: That is correct.
DUBNER: Oof. Okay, and describe for me overall the magnitude of this effect compared to, let's say, standard, you know, cardiology treatment, whether it's beta blockers or statins, angioplasties, stents. How much better off are you by having those interventions than you are by just simply going to the hospital when the cardiologists are not there?
JENA: So, just to give you a sense, the mainstays of treatment for heart disease are beta blockers, statins, aspirin, for some individuals, a blood thinner like Plavix. If you were to combine all those therapies together, we're probably talking about reducing your mortality by about 2 to 3 percentage points.
DUBNER: Wow, percentage points, okay. And here you're talking about 8 percentage points in one case and 10 percentage points in another.
JENA: Exactly. So these treatments are very effective, but they're not nearly as large in magnitude as what we're finding here.
Another finding in Jena's paper: while patients with cardiac arrest and heart failure were less likely to die during a cardiology conference, there was no difference in outcome for patients who were admitted with a heart attack. The study did find, however, that these patients received far less invasive treatment – stents and angioplasties, for instance – when many cardiologists were away.
JENA: So, an angioplasty is a procedure in which a balloon is inflated in one of the arteries that supply the heart. It basically opens up the blood vessel that was clogged. That is different than stenting. Stenting is a procedure in which an actual stent is placed in the heart and opens up the artery. And it keeps the artery open. There's nearly a third reduction in rates of angioplasty/stenting during meeting days. And remember, in heart attacks we didn't find any difference in mortality. So at the very least, what this would suggest is that, look, we're able to reduce these procedures by about a third, and yet we see no difference in mortality, in heart attacks.
DUBNER: What does the empirical research say about the efficacy of, say, angioplasty? In other words, we hear about these invasive treatments – angioplasty and stenting and so on, and we the public like to think that if doctors have gone to the trouble and researchers have gone to the trouble to come up with these things, of course they work really well – not only to come up with these things, but to use these things and to build for these things and so on. But talk to me for a moment about what we actually know or maybe don't know about the efficacy of such interventions.
JENA: These interventions, for example stenting or angioplasty, are extraordinarily effective. I think if you look at the interventions that have been developed in the last 30 years for heart disease, they rank at the highest in terms of their innovativeness and their effectiveness. And most of the patients for whom these interventions have been studied have been what I would characterize as average to moderate risk patients. There have been some studies with very severe coronary artery disease, very sick patients for whom these interventions have been studied. And even in those studies, they do find average benefits for these procedures. So by and large, I think if you were to look at this study without any information about the results, you would think to yourself, by lowering rates of these invasive procedures we are likely to harm patients.
But, as we know, that's not what the study found. Jena admits that, given the data, it's impossible to point to an exact cause.
JENA: The strongest limitation of the paper is that we can't tell you exactly what's going on. So, what I can tell you with as close to certainty is that something is happening in the hospitals that is responsible for the lower mortality on meeting days.
And keep in mind it's not as if there are no cardiologists in hospitals during annual meetings. Some docs cover for others; more junior staff might take over for a few days. Jena suspects that the doctors who stay behind may be more cautious.
JENA: What we're identifying is that group of patients for whom the cardiologists who are left behind may have thought to themselves, this person may not be appropriate for this procedure. And the clinical decisions that they're making are different then. And they could be different in a way that actually improves outcomes because they're restricting procedures for those who are at the margin, who would be least likely to benefit.
DUBNER: And your explanation would be that these are docs who are covering, who might be more junior or whatnot, and they are less likely to order up what a more senior, confident, experienced doctor might order up. Is that one explanation?
JENA: That's one explanation. Another explanation could be that the covering doctor says to himself or herself, "Look, I don't want to do this thing because I'd be better off not harming the patient by doing a procedure. Why don't I just wait and see what happens, simply because this is not my patient, I'm covering the patient for somebody else?"
And this, Jena says, brings us to the "less is more" dictum in medicine – which, he notes, is not universally embraced.
JENA: The perception of healthcare is that by doing more we can improve health. And what we need to recognize is that so much of healthcare, so much of the clinical decisions that we make operate in this gray zone. It's not black and white. And it could very well be the case that in the gray, less may be more.
DUBNER: Could it be that, you know, the doctors who are most likely to attend these conferences are those who are involved in research and that they, perhaps, aren't as good at clinical care, and the ones who are left behind are maybe better? Is that a possible explanation?
JENA: That's a possible explanation. I think the reason that we find our results predominantly in teaching hospitals is because if you look at the fraction of academic cardiologists who attend these meetings, and you look at the fraction of community cardiologists who attend these meetings, I think that the share would be larger among academic cardiologists. We haven't been able to get any great data from the American College of Cardiology or the American Heart Association. But whatever data they do publish online would support that. And so that's why it's not surprising that we saw the effects there.
DUBNER: I'm curious, Dr. Jena, have you heard from either the American Heart Association or the American College of Cardiology, the two conferences that you measured?
JENA: Not formally. I think the American College of Cardiology released a statement, which was very well-worded. It basically said, it's reassuring to know that during dates of national cardiology conferences, our patients receive no worse care, which is technically true.
DUBNER: Technically true. But I could see this being— I could see them playing it either way. They could take it as an indictment that they are, you know, they represent a bunch of people who don't contribute to better care. On the other hand, they could say, "Hey, you know, our conference is a major life-saver. We draw away all these people who are doing too many procedures, and that's saving a lot of lives." But I can't imagine they'll turn that into their slogan, would you?
JENA: Exactly. I've tried to advocate that to my own chair — to let me go to more conferences — but that hasn't worked.
DUBNER: We did ask the two organizations to respond to Jena's study. Richard Chazal is the American College of Cardiology or A.C.C.'s vice president and a practicing cardiologist.
Richard CHAZAL: I think many of us were— actually, were reassured that there wasn't an increase in risk during these meetings, because many people had hypothesized that might be the case, that when there was a departure of some physicians, that the staffing levels could result in an increased risk. So I do think it's reassuring to the public and to you and to me that we can safely get our care at a teaching hospital during periods of time of meetings. So that part is encouraging.
Pretty much as expected. Dr. Chazal did add this however:
CHAZAL: This is important and interesting information. The biggest concern here, and the one that we have to look at, is this finding, and to try to tease out, if we can in the future, why that is and how we modify our behavior so that we have a lower risk at all times.
The American Heart Association, meanwhile, sent us a recorded response from its president, Dr. Elliott Antman; we weren't allowed to interview him. Dr. Antman says there is no evidence of cause and effect in Jena's study, and that we should essentially think of it as a "calendar analysis."
Elliott ANTMAN: So, the investigators happened to analyze the period of time when cardiology meetings were occurring. They could have picked Christmas. They could have picked New Year's or Easter. We know that there are changes in the staffing schedule when there are holidays, when there are important national cardiology meetings. Bottom line for us at the American Heart Association, there's nothing in this study that we see that would lead us to recommend a change in clinical practice.
In my interview with Jena, I had raised the same point:
DUBNER: Okay. Is it possible that these cardiology conferences are perhaps typically held at the same time of year every year, which might be the time of the year that coincides with lower mortality?
JENA: That is definitely possible, but you know, as it turns out, over the nearly 10 years that we looked at the data, the cardiology conferences actually varied in their time. So it wasn't that they were always at the same time of the year. They actually do vary slightly from week to week across the 10 years.
DUBNER: Right. I'm curious, has there been any similar research with psychologists or other mental health professionals? I'm wondering if anyone has ever looked at suicide and/or hospitalization or even depression outbreaks, if such a thing could be measured, during psychiatric conferences or maybe even just during August when all the shrinks in New York go to Cape Cod.
JENA: No, that's a great question. I'm not aware of any. And I actually looked into this to see whether or not there was anything that was done. It's something we're going to do if it hasn't been done after an exhaustive search, but it's a great example. I'll give you another example of something we have actually looked at, which we do know data about and I'm sure you've heard about, is this July effect. It's the idea that patients who are hospitalized in academic medical centers in July have worse outcomes because the residents who are there are inexperienced. And by and large, what this literature has found is that the July effects, if they happen, are very small. And the question for clinicians was always, "Well, how is that possible?" How is it possible that something that every clinician thinks to be a big issue turns out to not be a big issue when you look at the data? And what we— the insight that we had is that every patient who comes into the hospital is different. And for most patients, it really does take a lot to lead to an adverse outcome. And so what happens if you focus on those patients who are the most sick? And what we did is look at the same kind of group of patients. We looked at patients who had heart attacks who are in the top third of predicted mortality. And these patients have a mortality rate of about, as I said, 25-30 percent. And what you see is that for those patients there actually is a July effect. So if you're hospitalized in a teaching hospital with a very severe heart attack, you are 5 percentage points more likely to die if you're hospitalized in July versus May. So, basically, 25 percent mortality versus 20 percent mortality. So it's a large effect. Of course, it goes in the opposite direction of what we're saying here in the sense that less is worse, but you know, that's one example of people looking at what happens around specific times of year or specific types of practices.
DUBNER: How do you account for that contradiction?
JENA: I think the contradiction is going to be what is the clinical decision that's being made. So, I keep on coming back to this in my mind. Why is this happening? And all I can come down to is I think that cardiologists are just making different clinical decisions during non-meeting dates. And I think the decision that's being made is, is this patient appropriate for a procedure? Because whenever you do something, you have to have in your mind, is this person good or bad for it? And let me give you another example. If a cardiologist had 100 procedures to allocate, and that's all they could do, I'm fairly confident that each one of the people that they allocated those 100 procedures to would do extraordinarily well. They'd have a beneficial outcome. But there is no constraint like that in reality. So you can go to the 101st, the 102nd.
DUBNER: That's such an interesting way to think about it. And it makes me think that the economist part of your brain is intruding on the medical part of your brain there, and I wonder if you're leading to some kind of relationship between cost and treatment and availability and supply and demand and so on. So, do you think that's— forget about just cardiology for a moment— do you think that's a major component of adverse outcomes that we're looking at generally, including just, you know, the fact that we spend more— a larger share of our G.D.P. than any other country on earth I believe for healthcare, and yet our outcomes are super sub-optimal. How much do you think that is due to a kind of endless— almost an endless supply and a relatedly very high demand?
JENA: You know, I think the common concern is that, because doctors are paid fee for service, meaning they get paid for every procedure that they do, that it leads to over-incentives for them to do procedures. I'm actually not convinced that that is really the root of all the quality problems that we find. My hunch is that the reason that physicians may be doing more procedures than is clinically optimal is that they just don't know any differently. If you think about what is it that impacts a physician's decision, well sure, what they get paid impacts it, just like it would impact anyone's decision. But what about where they went to medical school, what they learned during residency, whether or not they've been sued before? And most importantly, what is their level of risk aversion? I've got to imagine that that would translate somehow into clinical practice. I think that there are underlying differences in how people think, how cardiologists— how doctors think that drive these decisions.
JENA: That was an excerpt from the 2015 Freakonomics Radio episode number 202 called "How Many Doctors Does It Take To Start a Healthcare Revolution?" Or Freakonomics, M.D. Episode Minus 1, I guess. The Prequel. There's some other great interviews in it if you want to check it out. We'll put the link in the show notes.
When we did that episode, the cardiology study had just come out and the findings were so strange that a lot of people, including myself, weren't sure that it could be replicated.
There was also the thorny problem that the study left a lot of questions unanswered. Like, who exactly was attending these meetings? Were they people who spent most of their time doing scientific research and not seeing patients? If so, maybe that could explain why replacing them for just a few days could improve patient outcomes.
Since it was published, I have gotten some answers from two different studies my colleagues and I conducted. In 2018, we studied what happened to patients who have heart attacks during the dates of a different, but very specific cardiology meeting that is attended by doctors called interventional cardiologists. These are the types of doctors who specialize in procedures to treat heart attack patients. The general cardiology meetings that I'd studied initially are attended by all sorts of different cardiologists. Studying the effect of this specialized event kind of gave us a way to zoom in.
And we still found that patients with heart attacks had lower mortality rates if hospitalized during the dates of an interventional cardiology meeting.
We didn't see a difference in age or gender between the two groups of doctors. But here's what we could measure: The people who were going to conferences were more likely to have attended a top medical school, more likely to have received research funding from the National Institutes of Health or led a clinical trial, and they had nearly three times as many publications, on average.
We can infer that since the doctors who remained behind to treat patients tended to be less specialized in research, they may be more experienced and specialized in patient care.
And I thought, maybe that's what was happening in both studies. Patients may do better during these big conferences because it means they're even more likely to be treated by those cardiologists who are oriented towards hands-on patient care.
And here's where that new study I mentioned comes in. It was just released this week, actually. My colleagues Hirotaka Kato, Yusuke Tsugawa, Jose Figueroa and I, we examined whether doctors who treat fewer patients per year have worse outcomes than doctors who treat more. We studied hospitalized medical patients because those patients typically don't choose their doctors and vice versa, which means it's a good natural experiment. And we found that those doctors who split time between seeing patients and on research, administrative roles, or other work — and so they treat fewer patients — those patients had higher hospital mortality rates than those treated by doctors who were clinically more active.
Now, those of you who've been following this show from the beginning know that I am a doctor who splits time between seeing patients and doing economics research. So, I think there's value to having people working and learning across disciplines and in hybrid roles, but there may also be costs. And these follow up studies point to something that economists, and probably all of us, have known for a long time: that specialization matters. Practice matters.
All right folks, that's it for Freakonomics, M.D. this week. You can find links to all the studies we mentioned at freakonomics.com.
Also, please consider following the show. If you're enjoying the show and leave us a review, you'll help introduce the show to more people.
If you have thoughts on the show, shoot me an email. That's bapu@freakonomics.com.
Freakonomics, M.D. is part of the Freakonomics Radio Network, which also includes Freakonomics Radio, No Stupid Questions, and People I (Mostly) Admire. This show is produced by Stitcher and Renbud Radio. You can find us on Twitter and Instagram at @drbapupod. This episode was produced by Tricia Bobeda and mixed by Eleanor Osborne. Original music by Andrew Edwards. Our staff also includes Alison Craiglow, Greg Rippin, Joel Meyer, Jasmin Klinger, Emma Tyrrell, Lyric Bowditch, Jacob Clemente and Stephen Dubner. If you like this show or any other show in the Freakonomics Radio Network, please recommend it to your family and friends. That's the best way to support the podcasts you love. As always, thanks for listening.
"Association Between Physician Part-time Clinical Work and Patient Outcomes," by Hirotaka Kato, Anupam B. Jena, Jose F. Figueroa and Yusuke Tsugawa (JAMA Internal Medicine, 2021).
"Acute Myocardial Infarction Mortality During Dates of National Interventional Cardiology Meetings," by Anupam B. Jena, Andrew Olenski, Daniel M. Blumenthal, Robert W. Yeh, Dana P. Goldman and John Romley (Journal of the American Heart Association, 2018).
"Mortality and Treatment Patterns Among Patients Hospitalized With Acute Cardiovascular Conditions During Dates of National Cardiology Meetings," by Anupam B Jena, Vinay Prasad, Dana P Goldman and John Romley (JAMA Internal Medicine, 2015).
"How Many Doctors Does It Take to Start a Healthcare Revolution? (Ep. 202)," by Freakonomics Radio (2015).


text:
'Bond…Jane Bond'…Could the New Bond Be Female? Non-Binary?
Stefano Chiacchiarini
"Bond….Jane Bond." Don't laugh, that reality is a possibility! According to Barbara Broccoli, the producer of the 007 franchise, James Bond could be a non-binary in the days ahead.
Broccoli was in an interview recently in which she was asked about Daniel Craig's replacement. She was asked if it was possible for the next Bond to be a woman. Broccoli pretty much dismissed the idea that the next Bond could be a woman, but she did say that a future Bond could be "non-binary." That is someone who considers themselves to be neither male nor female.
The interview took place on the "Speaking to the Girls on Film" podcast. Broccoli talked about the fact that the present Bond, Daniel Craig, is stepping down after five movies portraying the iconic spy. His last appearance as Bond came in "No Time to Die."
It was reported in several news agencies that Anna Smith asked if Broccoli thought 007 would always be male. The famed producers responded, "I do because I don't think that we should be making films where women are playing men. I think we should be making more films about women. I think Bond will be a man."
That is when Anna Smith suggested that Bond be non-binary someday. Broccoli replied, "Who knows? I mean, I think it's open. We just have to find the right actor."
The lucrative Bond franchise is controlled by Broccoli through her production company. She also revealed that they wanted the next Bond to be British, but being British can mean a lot of things.
One Hollywood producer reacted immediately to the news of a non-binary Bond. They said that Bond needed to adapt to many things regarding the times we are living in, but a non-binary 007 could be really hard for fans to embrace.
It was way back in January of 2020 that Broccoli and fellow Bond producer Michael G. Wilson confirmed that 007 can be "any color" — black, white, brown. They said then that he would always be male.
It was Fox News that reported on Broccoli drawing the line on a male star. They quoted Broccoli as saying she believed those in charge of movies should be creating new characters for strong women. But she said that she was not interested in taking a male character and having a woman play it. Broccoli went further saying that women are "far more interesting than that."
It was even further back, in 2019, that former James Bond actor Pierce Brosnan revealed that he would like to see a gender-swap in the future with the title character. Brosnan was talking with The Hollywood Reporter when he said that the time has come for James Bond to become Jane Bond.
"I think we've watched the guys do it for the last 40 years. Get out of the way, guys, and put a woman up there. I think it would be exhilarating, it would be exciting. I don't think that's going to happen with the Broccolis. I don't think that is going to happen under their watch," Brosnan said.
The former Bond talked about the significance and deep pride he has for the character. Brosnan said that he will be asked about Bond until his dying days, it goes with the territory of playing the role of such a beloved character. He noted that he was honored playing Bond and he rejuvenated a franchise that had been dormant.
It was Daniel Craig that took the franchise to another level. In his first role, he played Bond in "Casino Royale." It grossed almost $595 million worldwide, and it was the highest-grossing Bond film until the release of "Skyfall." That Craig movie grossed over $1.1 billion worldwide.
I don't think you want to mess with such a successful brand…so it should stay "Bond…James Bond."
Previous articleAnother Political Witch Hunt for Trump Begins…
Next articleSenator Hawley Inflames Liberals With His Take on Masculinity

redpajama_set_name: RedPajamaCommonCrawl


text:
"""All the views for DrawWrite."""

# Imports {{{
import logging

from base64 import b64decode

from itertools import zip_longest

from django.core.files.base import ContentFile
from django.db import IntegrityError
from django.http import HttpResponseBadRequest, HttpResponseNotAllowed, JsonResponse
from django.shortcuts import redirect, render

from drawwrite.forms import CreateGameForm, JoinGameForm
from drawwrite.models import Chain, Game, DrawLink, Player, WriteLink

from . import services
from .bracefmt import BraceFormatter as __
# }}}

LOG = logging.getLogger(__name__)

# index {{{
def index(request):
    """
    The front page of the app.
    """
    LOG.debug("enter index")

    # Create the two forms that we'll put on this page.
    create_form = CreateGameForm()
    join_form = JoinGameForm()

    # TODO errors shouldn't get added by title and description, but by number.
    #      Then I should look up the title and description from that number.
    return render(request, 'drawwrite/index.html', {
        'create_form': create_form,
        'join_form': join_form,
        'error_title': request.session.pop('error_title', None),
        'error_description': request.session.pop('error_description', None),
    })
# }}}

# join_game {{{
def join_game(request):
    """
    Proccess data that a user sends when they want to join a game.
    """
    LOG.debug('enter')

    # Send all non-POSTs to the index.
    if request.method != 'POST':
        LOG.info(__('attempted non-supported method {0}', request.method))
        request.session['error_title'] = 'Unsupported method'
        request.session['error_description'] = (
            'You\'re not allowed to send {0} requests to that endpoint.'.format(request.method),
        )
        return redirect('drawwrite:index')

    # Get the form from the POSTed data.
    form = JoinGameForm(request.POST)

    # Invalid forms redirect to the index with an error.
    if not form.is_valid():
        LOG.debug(__(
            'name {0} or gamename {1} invalid',
            form.data['username'],
            form.data['gamename'],
        ))
        request.session['error_title'] = 'Invalid input'
        request.session['error_description'] = ' '.join((
            'Your Name and the Game Name must only contain letters, numbers,',
            'underscores, and hyphens.',
        ))
        return redirect('drawwrite:index')

    # Valid forms are processed.
    gamename = form.cleaned_data['gamename']
    username = form.cleaned_data['username']

    # Get the game. On error, add error objects to the session and redirect
    # to index.
    # TODO extract this, possibly to services.py
    games = Game.objects.filter( #pylint: disable=no-member
        name=gamename,
    ).filter(
        started=False,
    )
    if len(games) > 1:
        LOG.error(__('somehow, two games with name {0} are being created', gamename))
        request.session['error_title'] = 'Non-unique game name'
        request.session['error_description'] = 'Could not find a unique game for you to join'
        return redirect('drawwrite:index')
    if len(games) < 1:
        LOG.error(__('tried to join non-existant game {0}', gamename))
        request.session['error_title'] = 'Non-existent game'
        request.session['error_description'] = ' '.join((
            'The game that you attempted to join, {0},'.format(gamename),
            'does not exist. Please check that you entered it correctly.',
        ))
        return redirect('drawwrite:index')
    game = games[0]
    LOG.debug(__('got game for player {0}', username))

    # Add a player to the game. On error, add error objects to the session and
    # redirect to index.
    player = None
    try:
        player = services.new_player(game, username, False)
    except services.GameAlreadyStarted:
        LOG.debug(__('could not add {0} to game {1}', username, game.name))
        request.session['error_title'] = 'Game started'
        request.session['error_description'] = ' '.join((
            'The game that you attempted to join has already started. Please',
            'either join a different game or start your own game.',
        ))
        return redirect('drawwrite:index')
    # TODO don't assume that all IntegrityError's mean that the game name is
    #   already taken. There are plenty of other explanations that I'm
    #   silencing by doing this.
    except IntegrityError:
        LOG.exception(__(
            'player with {0} already exists in game {1}',
            username,
            gamename,
        ))
        request.session['error_title'] = 'Player exists'
        request.session['error_description'] = ' '.join((
            'The player name that you entered is already in use in the game',
            'that you are trying to join. Please choose a new player name',
            'and try again.',
        ))
        return redirect('drawwrite:index')

    # Redirect to that game's page.
    LOG.debug('exiting join game view')
    return redirect('drawwrite:play', player.pk)
# }}}

# create_game {{{
def create_game(request):
    """
    Create a game according to the values the user specified in the form.
    """
    LOG.debug('entering create game view')

    # Send all non-POSTs to the index.
    if request.method != 'POST':
        LOG.debug(__('attempted non-supported method {0}', request.method))
        return redirect('drawwrite:index')

    # Get the form from the POSTed data.
    form = CreateGameForm(request.POST)

    # Invalid forms redirect to the index with an error.
    if not form.is_valid():
        #LOG.debug(__(
        #    'username {0} or gamename {1} invalid',
        #    form.data['username'],
        #    form.data['gamename'],
        #))
        LOG.debug(__(
            'form error: {0}',
            form.errors,
        ))
        request.session['error_title'] = 'Invalid input'
        request.session['error_description'] = ' '.join((
            'Your Name and the Game Name must only contain letters, numbers,',
            'underscores, and hyphens.',
        ))
        return redirect('drawwrite:index')

    # Valid forms are processed.
    gamename = form.cleaned_data['gamename']
    username = form.cleaned_data['username']

    # Create game. On error, add error objects to the session and redirect
    # to index.
    # TODO handle other errors that could happen?
    game = services.new_game(gamename)
    if game is None:
        request.session['error_title'] = 'Game being created'
        request.session['error_description'] = (
            'The game you are trying to join, {0}, is already being created'
        ).format(gamename)

    # Create a player for that game. On error, add error objects to the
    # session and redirect to index.
    player = None
    try:
        player = services.new_player(game, username, True)
    # TODO don't assume that all IntegrityError's mean that the user name is
    #   already taken. There are plenty of other explanations that I'm
    #   silencing by doing this.
    except services.NameTaken as exception:
        LOG.error('player name already taken')
        request.session['error_title'] = 'Player name taken'
        request.session['error_description'] = exception.message()
        return redirect('drawwrite:index')
    except IntegrityError:
        LOG.error(__('a new game has an invalid player {0}', username))
        request.session['error_title'] = 'Player name taken'
        request.session['error_description'] = ' '.join((
            'The player name that you entered, {0},'.format(username),
            ' is already taken for the game that you entered. Please',
            'try a different one.',
        ))
        return redirect('drawwrite:index')

    # Redirect to that game's page.
    LOG.debug('exiting create game view')
    return redirect('drawwrite:play', player.pk)
# }}}

# play {{{
def play(request, player_id):
    """
    The page on which players play the game.
    """
    LOG.debug('enter play view')

    # Get their player from the database using the id in the path. On error,
    # set error session attributes and redirect to index.
    player = None
    try:
        player = Player.objects.get(pk=player_id) #pylint: disable=no-member
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('non-existant player attempt: {0}', player_id))
        request.session['error_title'] = 'Player Does Not Exist'
        request.session['error_description'] = ' '.join((
            'You attempted to access a non-existant player. Plase do not',
            'do that.',
        ))
        return redirect('drawwrite:index')
    LOG.debug(__('successfully retreived player {0}', player_id))

    # Get the game from the player object.
    game = player.game
    LOG.debug(__('successfully retreived game for player {0}', player_id))

    # If the game hasn't started, show the player the waiting screen.
    if not game.started:
        LOG.debug(__('game for player {0} has not started', player_id))

        # Get a list of all players in this game.
        all_players = Player.objects.filter(game=game) #pylint: disable=no-member
        LOG.debug(__('got players in game with player {0}', player_id))

        # Get the creator of the game.
        creator = None
        for player in all_players:
            if player.was_creator:
                creator = player
        LOG.debug(__('creator of game is {0}', creator.name))

        # Render the waiting screen with all of those players.
        LOG.debug(__('showing player {0} the waiting screen', player_id))
        return render(request, 'drawwrite/waiting.html', {
            'all_players' : all_players,
            'player_id' : player_id,
            'created' : player.was_creator,
            'creator' : creator,
        })
    LOG.debug(__('game for player {0} has started', player_id))

    # The game has started. Check if it's also finished.
    if game.round_num >= game.num_players:
        LOG.debug('game finished, redirect to view page')
        return redirect('drawwrite:showGame', game.pk)

    # The game has started, so decide whether to show the waiting page.
    if player.current_round == game.round_num + 1:

        # If the player's round equals the number of players in the game,
        # show the 'wait for game completion' game.
        if player.current_round == player.game.num_players:
            LOG.debug('show game finished waiting page')
            return render(request, 'drawwrite/gameWaiting.html', {
                'game_id' : game.pk,
            })

        # If the game isn't finished, show the waiting page for the next round.
        LOG.debug('show waiting page, this user is done with current round')
        return render(request, 'drawwrite/roundWaiting.html', {
            'player_id' : player_id,
        })

    # If the player's round doesn't equal the game's round, something is fishy.
    elif not player.current_round == game.round_num:
        LOG.error(__(
            'player {0} has round {1}, while game {2} has round {3}',
            player_id,
            player.current_round,
            game.pk,
            game.round_num,
        ))
        # TODO come up with a better thing to show the user in this case
        return HttpResponseBadRequest()

    # Figure out which position's chain this player should have access to next.
    chain_pos_to_get = (player.position + game.round_num) % game.num_players
    LOG.debug(__('player {0} needs position {1}s chain', player_id, chain_pos_to_get))

    # Get the owner of the chain that player will edit.
    chain_owner = None
    try:
        chain_owner = Player.objects.filter( #pylint: disable=no-member
            game=game,
        ).get(
            position=chain_pos_to_get,
        )
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error(__(
            'player with game {0} and pos {1} does not exist',
            game.pk,
            chain_pos_to_get,
        ))
        request.session['error_title'] = 'Player Does Not Exist'
        request.session['error_description'] = ' '.join((
            'You tried to get a player that does not exist. Sorry for',
            'the inconvenience.',
        ))
        return redirect('drawwrite:index')
    LOG.debug(__('got chain_owner ({0}) for player {1}', chain_owner.pk, player_id))

    # Get the chain for the player.
    chain = None
    try:
        chain = Chain.objects.get(player=chain_owner) #pylint: disable=no-member
    except Chain.DoesNotExist: #pylint: disable=no-member
        # Make a chain for this player.
        chain = services.new_chain(player)
    LOG.debug(__('got chain for user {0}', player_id))

    # If the chain has no links, show the player a screen to enter their first
    # text link.
    if chain.next_link_position == 0:
        LOG.debug(__('returning page for first link for user {0}', player_id))
        return render(request, 'drawwrite/chainAdd.html', {
            'prev_link_type': '',
            'prev_link': None,
            'player_id': player_id,
        })

    # Figure out what type of link the player needs to make.
    prev_link_pos = chain.next_link_position - 1
    prev_link = None
    prev_link_type = ''
    if prev_link_pos % 2 == 0:
        prev_link_type = 'write'
        prev_link = WriteLink.objects.get( #pylint: disable=no-member
            chain=chain,
            link_position=prev_link_pos
        )
    else:
        prev_link_type = 'draw'
        prev_link = DrawLink.objects.get( #pylint: disable=no-member
            chain=chain,
            link_position=prev_link_pos
        )

    # Show the player a page to add the next link type.
    LOG.debug('exit add to chain view')
    return render(request, 'drawwrite/chainAdd.html', {
        'prev_link_type': prev_link_type,
        'prev_link': prev_link,
        'player_id': player_id,
    })
# }}}

# check_game_start {{{
def check_game_start(request, player_id): #pylint: disable=unused-argument
    """Check if the passed player's game has started."""

    LOG.debug(__('checking game status for player {0}', player_id))

    # Get the player.
    player = None
    try:
        player = Player.objects.get(pk=player_id) #pylint: disable=no-member
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('non-existant player: {0}', player_id))
        return HttpResponseBadRequest()
    LOG.debug(__('successfully found player {0}', player_id))

    # If the player's game has not started, return an updated list of names.
    if not player.game.started:
        LOG.debug(__('player {0} game has not started', player_id))

        # Get all the players in the game.
        all_players = Player.objects.filter(game=player.game) #pylint: disable=no-member
        LOG.debug(__('got all players in game with {0}', player_id))

        # Create a list of all player names.
        names = []
        for player in all_players:
            names.append(player.name)
        LOG.debug('made list of all player names')

        # Return the data we need.
        return JsonResponse({'started': False, 'names': names})

    # If the player's game has started, return an object indicating as much.
    return JsonResponse({'started': True, 'names': []})
# }}}

# start_game {{{
def start_game(request, player_id):
    """Start the game of the player identified by player_id"""

    LOG.debug(__('starting game of player {0}', player_id))

    # Make sure method is POST.
    if not request.method == 'POST':
        LOG.error('attempted to GET to start game')
        return HttpResponseBadRequest()

    # Get the player.
    player = None
    try:
        player = Player.objects.get(pk=player_id) #pylint: disable=no-member
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('non-existant player {0}', player_id))
        return HttpResponseBadRequest()
    LOG.debug(__('successfully got player {0}', player_id))

    # Set the player's game to 'started'.
    services.start_game(player.game)
    LOG.debug('set players game to started')

    # Redirect to 'play'.
    LOG.debug('redirecting to play')
    return redirect('drawwrite:play', player_id)
# }}}

# create_link {{{
def create_link(request, player_id):
    """
    Accept POST data and create a new link in the chain that player_id should
    be adding to.
    """
    LOG.debug(__('creating link for player {0}', player_id))

    # Only accept POSTs
    if not request.method == 'POST':
        LOG.error('should have POSTed data')
        return HttpResponseNotAllowed(['POST'])
    LOG.debug(__('got POST data for player {0}', player_id))

    # Get the player.
    player = None
    try:
        player = Player.objects.get(pk=player_id) #pylint: disable=no-member
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('non-existant player {0}', player_id))
        request.session['error_title'] = 'Player Does Not Exist'
        request.session['error_description'] = ' '.join((
            'The player that you tried to create a link for does not exist.',
            'We apologize for the inconvenience.',
        ))
        return redirect('drawwrite:index')
    LOG.debug(__('got the player with pk {0}', player_id))

    # Calculate the position of the player that this player_id is adding to.
    chain_owner_pos = (player.position + player.game.round_num) % player.game.num_players
    LOG.debug(__('player {0} needs chain of player {1}', player_id, chain_owner_pos))

    # Get the owner of the chain this player is adding to.
    try:
        chain_owner = Player.objects.filter( #pylint: disable=no-member
            game=player.game,
        ).get(
            position=chain_owner_pos,
        )
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error(__(
            'player with game {0} and position {1} does not exist',
            player.game.pk,
            chain_owner_pos,
        ))
        request.session['error_title'] = 'Player Does Not Exist'
        request.session['description'] = ' '.join((
            'You attempted to access a player that does not exist. We are',
            'sorry for the inconvenience.',
        ))
        return redirect('drawwrite:index')
    LOG.debug(__('successfully got chain owner for player {0}', player_id))

    # Get the player's chain.
    chain = None
    try:
        chain = Chain.objects.get(player=chain_owner) #pylint: disable=no-member
    except Chain.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('player {0} should have a chain but does not', player_id))
        request.session['error_title'] = 'Player Has No Chain'
        request.session['error_description'] = ' '.join((
            'The player that you tried to create a link for does not have',
            'a chain, but that should not be possible. We apologize for',
            'the inconvenience.',
        ))
        return redirect('drawwrite:index')
    LOG.debug(__('got the chain for player with pk {0}', player_id))

    # Figure out what type of link to make.
    if chain.next_link_position % 2 == 0:
        # The POST data needs to have the 'description' field or something
        # is wrong.
        if 'description' not in request.POST.keys():
            LOG.error(' '.join((
                'should be making write link, but did not receive any',
                'writing in the POSTed data',
            )))
            return HttpResponseBadRequest()
        LOG.debug(__('making new write link for player {0}', player_id))

        # Make the new write link.
        services.new_write_link(chain, request.POST.get('description'), player)

    else:
        # The POST data needs to have the 'drawing' field or something
        # is wrong.
        if 'drawing' not in request.POST.keys():
            LOG.error(' '.join((
                'should be making a draw link, but did not receive any',
                'drawing data in the POSTed data',
            )))
            return HttpResponseBadRequest()
        LOG.debug('got image data to save')

        # Make sure the data starts with 'data:image/png;base64,'
        data_string = request.POST.get('drawing')
        if not data_string.startswith('data:image/png;base64,'):
            LOG.error(__('got bad image data: started with {0}', data_string[0:15]))
            return HttpResponseBadRequest()
        LOG.debug('got good(ish) image data')

        # Shave off the stuff from above.
        data_string = data_string.split(';base64,')[1]
        LOG.debug('split off the ;base64, stuff')

        # Decode the base64 data.
        binary_data = b64decode(data_string)
        LOG.debug('decoded base64 data')

        # Make a file-like object out of the data.
        file_name = "link-{0}-{1}.png".format(player_id, chain.next_link_position)
        file_obj = ContentFile(binary_data, name=file_name)
        LOG.debug(__('made file with name {0}', file_name))

        # Make the draw link.
        services.new_draw_link(chain, file_obj, player)
        LOG.debug(__('created draw link, file has name {0}', file_name))

    # Increase the 'num_players_finished_current_round' of this game.
    services.player_finished(player)

    # Redirect to 'play'.
    return redirect('drawwrite:play', player_id)
# }}}

# check_round_done {{{
def check_round_done(request, player_id):
    """
    Check if the round of the current game is completed. Return a javascript
    object that has a list of every player's name that has not completed the round.
    """
    LOG.debug(__('checking if round is completed for player {0}', player_id))

    # Get the player.
    player = None
    try:
        player = Player.objects.get(pk=player_id) #pylint: disable=no-member
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error('attempted to get player that does not exist')
        request.session['error_title'] = 'Player Does Not Exist'
        request.session['error_description'] = ' '.join((
            'The player that you attempted to get does not exist. We are',
            'sorry for the inconvenience.',
        ))
        return redirect('drawwrite:index')
    LOG.debug(__('successfully got player {0}', player_id))

    # Check if the game round equals the player's round. If so, then the
    # player is allowed to move on. Otherwise, they're not.
    if player.game.round_num == player.current_round:
        LOG.debug('round is completed')

        # Return an object saying that the round is done.
        return JsonResponse({'finished': True})
    LOG.debug('round is not completed')

    # Get all players in the game who have not completed the
    # current round.
    try:
        players_still_playing = Player.objects.filter( #pylint: disable=no-member
            game=player.game,
        ).filter(
            current_round__lt=player.current_round,
        )
    except BaseException as exception:
        LOG.error(exception)
        raise
    LOG.debug('got list of players still playing')

    # Turn the players into a list of names.
    names_still_playing = []
    for player in players_still_playing:
        names_still_playing.append(player.name)
    LOG.debug('got list of names of players still playing')

    # Return an object saying that the round is not done.
    return JsonResponse({
        'finished': False,
        'still_playing': names_still_playing,
    })
# }}}

# check_game_done {{{
def check_game_done(request, game_id): #pylint: disable=unused-argument
    """Check if the game with the passed game_id is finished."""

    LOG.debug(__('checking if game {0} is done', game_id))

    # Get the game.
    game = None
    try:
        game = Game.objects.get(pk=game_id) #pylint: disable=no-member
    except Game.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('tried to get non-existant game {0}', game_id))
        # TODO better error stuff
        return HttpResponseBadRequest
    LOG.debug(__('got game {0}', game_id))

    # Check if the round equals the number of players.
    if game.round_num == game.num_players:
        return JsonResponse({'finished': True})

    # Get a list of players whose current round equals the game's round.
    try:
        players_still_playing = Player.objects.filter( #pylint: disable=no-member
            game=game,
        ).filter(
            current_round=game.round_num,
        )
    except BaseException as exception:
        LOG.error(exception)
        raise
    LOG.debug('got list of players still playing')

    # Turn that list of players into a list of names.
    names_still_playing = []
    for player in players_still_playing:
        names_still_playing.append(player.name)
    LOG.debug('created list of names of players still playing')

    # Return an object saying that the round is not done.
    return JsonResponse({
        'finished': False,
        'still_playing': names_still_playing,
    })
# }}}

# show_game {{{
def show_game(request, game_id):
    """Show a completed game."""

    LOG.debug(__('showing game {0}', game_id))

    # Get the game.
    game = None
    try:
        game = Game.objects.get(pk=game_id) #pylint: disable=no-member
    except Game.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('tried to get non-existant game {0}', game_id))
        # TODO better error here
        return HttpResponseBadRequest()
    LOG.debug(__('got game {0}', game_id))

    # Get all players associated with that game.
    players = Player.objects.filter(game=game) #pylint: disable=no-member

    # Render the game view page.
    # Change gameName to game_name
    return render(request, 'drawwrite/game.html', {
        'players': players,
        'game_name': game.name,
    })
# }}}

# show_chain {{{
def show_chain(request, player_id):
    """Show a completed chain."""

    LOG.debug(__('showing chain of player {0}', player_id))

    # Get the player.
    player = None
    try:
        player = Player.objects.get(pk=player_id) #pylint: disable=no-member
    except Player.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('tried to get non-existant player {0}', player_id))
        # TODO better error messege
        return HttpResponseBadRequest()
    LOG.debug(__('got player {0}', player_id))

    # Get the chain.
    chain = None
    try:
        chain = Chain.objects.get(player=player) #pylint: disable=no-member
    except Chain.DoesNotExist: #pylint: disable=no-member
        LOG.error(__('tried to get non-existant chain for player {0}', player_id))
        # TODO better error message
        return HttpResponseBadRequest()
    LOG.debug(__('got chain for player {0}', player_id))

    # Get all the write links and all the draw links.
    write_links = WriteLink.objects.filter(chain=chain) #pylint: disable=no-member
    draw_links = DrawLink.objects.filter(chain=chain) #pylint: disable=no-member

    # Make a list of all the links in the chain.
    links = []
    for write, draw in zip_longest(write_links, draw_links):
        if write is not None:
            links.append(write)
        if draw is not None:
            links.append(draw)
    LOG.debug(__('made list of all links for player {0}', player_id))

    # Render the chain view.
    return render(request, 'drawwrite/chain.html', {
        'links': links,
        'player': player,
    })
# }}}

# get_available_games {{{
def get_available_games(request):
    """Return a list of game names that may be joined."""
    being_created = Game.objects.filter(started=False) #pylint: disable=no-member
    options = []
    for game in being_created:
        options.append(game.name)
    LOG.debug('returning list of available games')
    return JsonResponse({'options': options})
# }}}

redpajama_set_name: RedPajamaGithub


2019 Lexus LC-F CVT Colors, Release Date, Redesign, Price – Lexus could start a range-topping LC F sports car in 2019 operated by an upgraded variation of the LC 500h's hybrid system. It might price more than £100,000 and would competitor top-spec BMW M6 and Mercedes-AMG E63 Coupe models.
The Lexus LC, demonstrated through, is a big four-seater sports car run by both a 470hp V8 or a 354hp V6 engine combined with an electric motor. It will continue purchase in Summer season 2018 and may remain competitive in opposition to the loves of the BMW 6 Series and Jaguar F-Type.
A lengthy bonnet, lower roofline and an established of sizeable alloy rims allow the LC a conventional reduced-slung sports car look. We count on the forthcoming 2019 Lexus LC-F model in the future with a myriad of added sporty details such as larger sized oxygen intakes, a deeply top splitter and a variety of gaping air vents minimize into its shapely bonnet and wings. Its rear conclusion could feature an assortment of new exhaust ideas, much like individuals installed to the pre-existing RC F, and a new diffuser to make it as aerodynamically slick as feasible.
The regular LC features an elegant cabin which not only appearance and believes like a correct luxury product or service, but incorporates a lot of design features much more similar to a concept car than a generation model. The stainless door takes care of and substantial leather material-cut door sections appearance in contrast to anything at all made available from the Lexus' major competition. The LC F is anticipated to consider this remarkable interior and add more a choice of racy details. Together with a small number of F badges, it can be handled to vibrant red leather material furniture and carbon fiber toned to aid set it up in addition to the common LC.
Lexus has not unveiled any established particulars but the 2019 Lexus LC-F is anticipated to be driven by possibly an improved model of the LC 500h's V6 hybrid drive system or a turbocharged model of the 500's 5.-litre V8.
The initially alternative would definitely make the LC F a unique undertaking in the luxury sports car class – not one other company presently delivers a V6 hybrid GT car. The next could cause an appealing 600hp competitor to the enjoys of the BMW M6 and Jaguar F-Type SVR.
Need to Lexus elect to acquire the hybrid course, the LC F will most likely feature a very similar revolutionary gearbox system to the 500h. This model makes use of each a CVT automatic gearbox and a conventional torque-converter unit to provide equally easy changes when sailing and sporty gear changes when you place your feet lower.
We may delay until 2019 for the LC F to be on the transaction – all things considered, the normal LC will not show up in showrooms till Summer season 2018. Whenever it smashes cover, we assume the effective F edition to price more than £100,000.


text:
Термин геометрическая координация используется в целом ряде смежных областей химии — химии/физики твердого тела и не только.

Молекулы

Координационная геометрия атома в геометрическом соединении, образованном атомами вокруг центрального атома.

Координационные комплексы неорганических соединений
В области неорганических геометрических комплексов координации эти соединения являются геометрическими моделями, образованными атомами лигандов, которые связаны с центральным атомом в молекуле и комплексным соединением. Геометрическое расположение варьируется в зависимости от количества и типа лигандов, связанных с центром, состоящим из металла, а также координационного преимущества () центрального атома, как правило, металла в координационном комплексе. Число соединений (то есть число σ-связей между центральным атомом и лигандами), называется координационным числом. Геометрическая модель может быть описана как многогранник, где вершины многогранника являются центрами координации атомов лигандов.

Координационное преимущество металла часто варьируется в зависимости от его степени окисления. Число координационных связей (координационное число) может варьироваться от двух до 20.

Одна из самых распространенных геометрических координаций — октаэдрическая, где шесть лигандов координируются к металлу симметричным распределением, что ведет к образованию октаэдра, если линии нарисованы между лигандами. Менее встречающиеся в общей геометрии координации являются формы тетраэдра и «плоского квадрата» (2D квадрат).

Теория кристаллического поля может быть использована для объяснения относительной устойчивости соединений переходных металлов различной геометрической координации, а также наличия или отсутствия парамагнетизма.

ТОЭП может быть использована для предсказания геометрии комплексов основных элементов группы (исключение составляют актиноиды и лантаноиды).

Кристаллографическое использование
В кристаллической структуре геометрическая модель атома является геометрической структурой координации атомов, где определение координации атомов зависит от связей в модели. Например, в каменной соли, ионный состав каждого атома натрия содержит шесть ближайших соседних хлорид-ионов в октаэдрической геометрии и каждый хлорид аналогично — шесть соседних ионов натрия в октаэдрической геометрии. В металлах с объемноцентрированной структурой каждый атом имеет связь с восмью ближайшими другими атомами с кубической геометрией. В металлах с гранецентрированной кубической структурой каждый атом имеет двенадцать связей с соседними атомами с кубооктаэдрической геометрией.

Где нет дискретных комплексов означает, что соединения найдены как отдельные единицы сфер вокруг атомов в кристаллах

Именование неорганических соединений
ИЮПАК ввел полиэдрический символ () в части «рекомендации номенклатуры по ИЮПАК в неорганической химии 2005» () для описания геометрии вокруг атома в соединении.

IUCr (International Union of Crystallography) предложили символ, который показывается как верхний индекс в квадратных скобках в химической формуле. Например, CaF2 будет записан как Ca[8СВ]F2[4T], где [8СВ] означает что это кубическая координация и [4T] означает — четырехгранная. Эквивалентный символ в ИЮПАК обозначается как CU−8 и T-4 соответственно.

Символ ИЮПАК применим к комплексам и молекулам, в то время как по предложению IUCr это относится к кристаллическим твердым телам.

См. также
 Молекулярная геометрия
 Теория поля лигандов

Молекулярная физика
Химическая связь
Координационная химия

redpajama_set_name: RedPajamaWikipedia


My mantra is: Let there be happiness in my soul, and let me share it with the world.
I have my clothes made in Hong Kong, but I love Shangai Tang in New York.
When I was little, I got to pick my hair ribbon from my mother's collection that hung over her dressing-table mirror. I have an entire room of ribbons in my New York apartment.
I find it soothing to take something wrinkled and make it smooth. It feels anticipatory. It's what I do before a celebration. And nobody bothers me when I'm ironing.
I want to inspire through example. I hope my books motivate others to open doors and windows that will help them to embrace their own truth, light and joy.
Each of us must become impassioned, finding meaning and self-fulfillment in our own life's journey.
I like people to really get a feel for the house before they do anything to it.
Don't feel you have to buy something to sit in or at. Buy something you are emotionally attached to and build your design around that. One Matisse cutout poster could provide you with your whole color scheme!
You're not going to be dreary on the inside if you're not dreary on the outside.
I get all dressed up in fuchsia, looking like a clown, and show pretty pictures to people.
Unhappy people make me feel like I've done something wrong.
I don't want to go anywhere; I don't want to leave anybody behind. Happiness is right here, right now, in this world, in this room. I am happiest wherever it is that I am.
You can't be a resource for others unless you nourish yourself.
We have to establish time boundaries and learn how to say no.
I want my readers to find their own way.
Our home, just like our garden, evolves. We experiment, try out different things and new colors until we feel content. Try to keep the metaphor of home as garden in your consciousness.
When I'm the happiest, my desk is not neat. It has lots of pens and the books I love. It gets messy when I'm in the flow. So many houses are so neat.
Unused rooms are such bad feng shui, really bad energy.
I find that through all my work, I really get to see and feel energy, health and vitality between people and their surroundings and how they interact with each other.
My grandfather was a Methodist preacher, and my father was an unsuccessful businessman. We didn't have status or wealth.
I think of myself as the little girl Renoir painted with the watering can. I loved the garden colors.
Colors are important. People are in clinical depression whether they are on medication or not. Neutrals are another form of medication.
Feeling at home with ourselves and being able to create a spirit of place that nourishes us physically, emotionally and spiritually is a goal worthy of our highest priority.
We can raise our sights high when we're willing to break free from being conformists who live a conventional life simply because we are too afraid to express our uniqueness.
I urge readers to experience things that they love and give up things that are not working.
We can live closer to our dreams if we are willing to dream them. And we can create a life as we want it to be.


Rebelscum.com: Bandai To Produce Star Wars S.H. Figuarts Figures?
Bandai To Produce Star Wars S.H. Figuarts Figures?
What is being speculated as a new line is simply a blog post by one of Bandai's S.H. Figuart design team members known as Mr. Y. The text is about the Masked Riders event posted above, and the only reference to Star Wars on the page states they will not release any new R2 die-cast info yet. And the Yoda Silhouette? Sadly, that is nothing more than a cool avatar used by Mr. Y when posting to the blog. The reports of a Star Wars S.H. Figuarts are not true. At least not yet.
All of this begs the question of what would happen if Bandai were to produce a Star Wars S.H. Figuarts figure line. First off, they have already produced an amazing Star Wars toy this year with the Tamashii Nations 12-inch Perfect Model Chogokin figure. So they do have the license to make figures, and they could theoretically do that at some point.
The big question will be whether the figure line would see North American distribution. Bandai (Bandai Japan not Bandai U.S.A., which only handles domestic brands and does not involve itself in imports) stopped their in house export distribution some time back and now has all their items sold under the Tamashii Nations banner through a wholesaling distribution deal with Bluefin Distribution, the articulated Star Wars toy license for products released in North America are held by Hasbro and to a lesser extent Sideshow Collectibles, and Bluefin would have to work a deal with Hasbro to see it happen.
While the C-3PO was brought in with a limited partnership with Sideshow Collectibles that allowed the figure to be sold under their license, can the same be said for the S.H. Figuarts products? First off, the S.H. Figuarts figures are between 6 to 7 inches tall, and that would put them in the same, or close to the same scale as Hasbro's upcoming 6-inch Black Series collection. Considering the efforts Hasbro is making to create a new collecting scale for the dedicated 3 3/4-inch adult collectors, is it feasible for them to allow another product line to come into the North American market and compete for your money?
What could you expect if Hasbro says no to the North American distribution of a S.H. Figuarts line? Simply put, you'd have to rely on ordering from International retailers and online stores or go on eBay. Any of these options will mean you'll be paying inflated prices. Will that hurt the line? Probably not, since Star Wars is cultural phenomenon the world over. would North American Star Wars collectors pay the price for them? Historically speaking, probably not.
August 25, 2015 Tamashii Nations: S.H. Figuarts Obi-Wan Kenobi, Battle Droid, & A New Darth Vader!
June 14, 2014 Tokyo Toy Show Reveals Samurai Darth Vader And More!